SQL Server 2000 / SQL Server 2005'te varolan bir tabloya varsayılan değeri olan bir sütunu nasıl ekleyebilirim ?
SQL Server 2000 / SQL Server 2005'te varolan bir tabloya varsayılan değeri olan bir sütunu nasıl ekleyebilirim ?
Yanıtlar:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.
İsteğe Bağlı Kısıtlama Adı:
Dışarıda bırakırsanız CONSTRAINT D_SomeTable_SomeCol
SQL Server otomatik olarak oluşturulur
gibi komik bir Ad ile bir Varsayılan- :DF__SomeTa__SomeC__4FB7FEF6
Opsiyonel With-Değerler Beyanı: Yalnızca Sütun null olduğunda gereklidir
ve Değer Kayıtları Mevcut kullanılan varsayılan istiyorum.
Sütununuz doğruysa,
belirttiğiniz tüm Varolan Kayıtlar için otomatik olarak Varsayılan Değeri kullanırWITH VALUES
NOT NULL
WITH VALUES
da .
Nasıl bir Standart-Kısıtlama ile ekler çalışma:
Eğer içine a Record eklerseniz SomeTable
ve do not belirtin SomeCol
'ın değerini, o zaman için Standart edecektir 0
.
Bir Record eklerseniz ve belirtme SomeCol
olarak 'ın değerini NULL
(ve sütunun boş değerlere izin verir),
ardından Varsayılan-Kısıtlama olacak değil kullanılabilir veNULL
Değer olarak eklenecektir.
Notlar aşağıda herkesin harika geri bildirimlerine dayanıyordu.
Özel Teşekkürler:
@Yatrix, @WalterStabosz, @YahooSerious ve Yorumlarından dolayı @StackMan.
NOT NULL
. Lütfen bunu deneyin: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;
Sütun için 2 NULL değer göreceksiniz b
.
WITH VALUES
Mevcut null olabilecek satırları güncellemek için kullanın . Bkz. MSDN : "Eklenen sütun null değerlere izin veriyorsa ve WITH VALUES
belirtilirse, varsayılan değer varolan satırlara eklenen yeni sütunda depolanır."
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
VARSAYILAN'ın eklenmesi, var olan satırlardaki sütunu varsayılan değerle doldurur , bu nedenle NOT NULL kısıtlaması ihlal edilmez.
Bir eklerken null sütun , WITH VALUES
belirli bir varsayılan değeri mevcut satır uygulanır sağlayacaktır:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
Kısıtlamalı bir sütunun her zaman bir değere sahip olacağını varsaymak kolaydır - yani, NOT NULL
belirtilmemiş olsa bile NULL değil.
BIT
veri türü hakkında konuşmuyordum , bu özel BIT
sütun hakkında konuşuyordum . Cevaba bak, sütun olarak bildirildi NOT NULL
.
ALTER TABLE <table name>
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name>
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO
Eklediğiniz sütunun bir NOT NULL
kısıtlaması olduğunda, ancak bir DEFAULT
kısıtlaması (değeri) olmadığında dikkat edin . ALTER TABLE
Tablo içinde herhangi bir satır varsa deyimi bu durumda başarısız olacaktır. Çözüm, ya NOT NULL
kısıtlamayı yeni sütundan kaldırmak ya da bunun için bir DEFAULT
kısıtlama sağlamaktır .
Birden çok sütun eklemek istiyorsanız, bunu şu şekilde yapabilirsiniz:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
kullanın:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Başvuru: ALTER TABLE (Transact-SQL) (MSDN)
Var olan bir veritabanı tablosuna varsayılan değeri olan bir sütun eklemek için şunları kullanabiliriz:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
Var olan bir veritabanı tablosuna varsayılan değeri olan bir sütun eklemenin başka bir yolu.
Varsayılan değere sahip bir sütun eklemek için çok daha ayrıntılı bir SQL betiği, sütunun eklemeden önce var olup olmadığını kontrol etmeyi de içerir ve ayrıca kısıtlamayı kontrol eder ve varsa bırakır. Bu komut dosyası da kısıtlamayı adlandırır, böylece güzel bir adlandırma kuralına sahip olabiliriz (DF_'yi seviyorum) ve eğer değilse SQL bize rastgele oluşturulmuş bir sayıya sahip bir adla bir kısıtlama verecektir; bu yüzden kısıtlamayı da adlandırabilmeniz güzel.
-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
IF EXISTS ( SELECT 1
FROM sys.default_constraints
WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
)
BEGIN
------ DROP Contraint
ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
END
-- ----- DROP Column -----------------------------------------------------------------
ALTER TABLE [dbo].table_Emplyee
DROP COLUMN Column_EmployeeName
PRINT 'Column Column_EmployeeName in images table was dropped'
END
--------------------------------------------------------------------------
-- ADD COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
----- ADD Column & Contraint
ALTER TABLE dbo.table_Emplyee
ADD Column_EmployeeName BIT NOT NULL
CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] DEFAULT (0)
PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
END
GO
Bunlar, varolan bir veritabanı tablosuna varsayılan değeri olan bir sütun eklemenin iki yoludur.
Bu işlemi T-SQL ile aşağıdaki şekilde yapabilirsiniz.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Ayrıca SQL Server Management Studio'yu da kullanabilirsiniz Tasarım menüsünde tabloya sağ tıklayıp varsayılan değeri tablo olarak ayarlayarak da kullanabilirsiniz.
Ayrıca, aynı sütunu (yoksa) veritabanındaki tüm tablolara eklemek istiyorsanız, şunu kullanın:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
SQL Server 2008-R2'de, bir test veritabanında tasarım moduna geçiyorum ve tasarımcıyı kullanarak iki sütunumu ekleyip ayarları GUI ile yapıyorum ve ardından rezil Right-Click" Değişiklik Komut Dosyası Oluştur " seçeneğini veriyor !
Bang up, doğru şekilde biçimlendirilmiş garantili çalışma değişiklik komut dosyası ile küçük bir pencere açar. Kolay düğmeye basın.
Alternatif olarak, kısıtlamayı açıkça adlandırmak zorunda kalmadan bir varsayılan ekleyebilirsiniz:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
Bu kısıtlamayı oluştururken var olan varsayılan kısıtlamalarla ilgili bir sorununuz varsa, bunlar tarafından kaldırılabilir:
alter table [schema].[tablename] drop constraint [constraintname]
Bu SSMS GUI'de de yapılabilir. Aşağıda varsayılan bir tarih gösteriyorum, ancak varsayılan değer elbette ne olursa olsun olabilir.
(getdate())
ya abc
ya 0
ya sen istedikleri değeri Standart Değer veya Cilt aşağıdaki resimde gösterilen alana:ALTER TABLE ADD ColumnName {Column_Type} Constraint
ALTER TABLE (Transact-SQL) adlı MSDN makalesinde tüm değiştirme tablosu sözdizimi vardır.
Misal:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
Bunun çok cevabı var, ama bu genişletilmiş yöntemi eklemeye ihtiyacım var. Bu çok daha uzun görünüyor, ancak etkin bir veritabanında milyonlarca satır içeren bir tabloya NOT NULL alanı ekliyorsanız son derece yararlıdır.
ALTER TABLE {schemaName}.{tableName}
ADD {columnName} {datatype} NULL
CONSTRAINT {constraintName} DEFAULT {DefaultValue}
UPDATE {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
ALTER TABLE {schemaName}.{tableName}
ALTER COLUMN {columnName} {datatype} NOT NULL
Bunun yapacağı şey, sütunu boş değerli bir alan olarak eklemek ve varsayılan değerle, tüm alanları varsayılan değere güncelleyin (veya daha anlamlı değerler atayabilirsiniz) ve son olarak sütunu NULL DEĞİL olarak değiştirir.
Bunun nedeni, büyük ölçekli bir tabloyu güncellemeniz ve her bir satıra yazması gereken yeni bir boş alan eklemeniz ve böylece sütunu ekleyip tüm değerleri yazarken tüm tabloyu kilitlemesidir.
Bu yöntem, kendi başına çok daha hızlı çalışan nullable sütununu ekler, ardından null olmayan durumu ayarlamadan önce verileri doldurur.
Her şeyi bir ifadede yapmanın daha aktif tablolarımızdan birini 4-8 dakika boyunca kilitleyeceğini ve genellikle süreci öldürdüğümü fark ettim. Bu yöntem, her parça genellikle sadece birkaç saniye sürer ve minimum kilitlemeye neden olur.
Ayrıca, milyarlarca satır alanında bir tablonuz varsa, güncellemeyi şu şekilde toplu hale getirmeye değer olabilir:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
Bunu dene
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL Server + Tablo Değiştirme + Sütun Ekle + Varsayılan Değer uniqueidentifier
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
IF NOT EXISTS (
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END
NOT EXISTS
Masayı değiştirmeye çalışmadan önce kontrolü seviyorum . Çok iyi bir çözüm. Bunun nasıl işe yarayacağına dair bazı ek yorumlar daha da yararlı olacaktır.
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Bir tabloya yeni bir sütun ekleyin:
ALTER TABLE [table]
ADD Column1 Datatype
Örneğin,
ALTER TABLE [test]
ADD ID Int
Kullanıcı otomatik olarak artırılmasını istiyorsa:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Bu SQL Server içindir:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
Misal:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
Kısıtlamalar eklemek istiyorsanız:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Bu, aşağıdaki kod ile yapılabilir.
CREATE TABLE TestTable
(FirstCol INT NOT NULL)
GO
------------------------------
-- Option 1
------------------------------
-- Adding New Column
ALTER TABLE TestTable
ADD SecondCol INT
GO
-- Updating it with Default
UPDATE TestTable
SET SecondCol = 0
GO
-- Alter
ALTER TABLE TestTable
ALTER COLUMN SecondCol INT NOT NULL
GO
Aşağıdaki sorguyu deneyin:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Bu, Tabloya yeni bir sütun ekleyecektir.
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
Bu sorgudan, varsayılan değer 0 olan bir veri tipi tamsayı sütunu ekleyebilirsiniz.
Şimdi, önceki cevabımda bazı değişiklikler yaptım. Bahsedilen cevapların hiçbirinin olmadığını fark ettim IF NOT EXISTS
. Bu yüzden, masayı değiştirirken bazı sorunlarla karşılaştığım için yeni bir çözüm sunacağım.
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO
İşte TaskSheet
belirli tablo adı ve IsBilledToClient
ekleyeceğiniz yeni sütun ve 1
varsayılan değer. Bu, yeni sütunda mevcut satırların değerinin ne olacağı anlamına gelir, bu nedenle biri otomatik olarak orada ayarlanır. Ancak, kullandığım gibi sütun türüne göre istediğiniz gibi değiştirebilirsinizBIT
, bu yüzden varsayılan 1 değerini koydum.
Yukarıdaki sistemi öneririm, çünkü bir sorunla karşılaştım. Peki sorun ne? Sorun, IsBilledToClient
sütun tablo tabloda varsa, o zaman sadece aşağıda verilen kodun bir kısmını yürütürseniz SQL Server Query builder'da bir hata göreceksiniz. Ancak yoksa, ilk kez yürütülürken hata olmaz.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]