SQL Server'da varolan bir tabloya varsayılan değeri olan bir sütun ekleme


Yanıtlar:


3498

Sözdizimi:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Misal:

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.

Notlar:

İsteğe Bağlı Kısıtlama Adı:
Dışarıda bırakırsanız CONSTRAINT D_SomeTable_SomeColSQL 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ır
WITH VALUES

NOT NULL
WITH VALUES da .

Nasıl bir Standart-Kısıtlama ile ekler çalışma:
Eğer içine a Record eklerseniz SomeTableve do not belirtin SomeCol'ın değerini, o zaman için Standart edecektir 0.
Bir Record eklerseniz ve belirtme SomeCololarak 'ı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.


332
Sütun boş bırakılabilirse, boş değerin mevcut satırlar için kullanılan değer olacağını unutmayın.
Richard Collette

17
@Thecrocodilehunter Nullable sütunu, sütun değeri için Null ekleyebileceğiniz anlamına gelir. Null olabilecek bir sütun değilse, bu veri türünün bir değerini girmeniz gerekir. Bu nedenle, mevcut kayıtlar için, bunlara Null eklenir ve yeni kayıtlarda, aksi belirtilmedikçe varsayılan değeriniz eklenir. Mantıklı olmak?
Yatrix

41
Ben açıkça varsayılan kısıtlama adlandırır çünkü bu cevap dbugger's biraz daha iyi gibi. Adının otomatik olarak oluşturulması dışında dbugger'ın sözdizimi kullanılarak varsayılan bir kısıtlama yine de oluşturulur. DROP-CREATE komut dosyaları yazarken tam adı bilmek yararlıdır.
Walter Stabosz

18
@Vertigo SADECE sütun doğruysa bu doğrudur 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.
ErikE

48
WITH VALUESMevcut null olabilecek satırları güncellemek için kullanın . Bkz. MSDN : "Eklenen sütun null değerlere izin veriyorsa ve WITH VALUESbelirtilirse, varsayılan değer varolan satırlara eklenen yeni sütunda depolanır."
Yahoo Serious

1008
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.


13
Bu yanıtla ilgili sorun, varsayılan değerin yalnızca yeni kayıtlar için geçerli olmasıdır. Mevcut kayıtlar hala NULL değerine sahip olacaktır.
Roee Gavirel

130
Böyle olmadığını göreceksin. Aksi takdirde kısıtlama ihlal edilir.
dbugger

35
Mevcut satırlardaki sütunlar varsayılan değerle doldurulur. Küçük bir ampirik test bunu kanıtlayacaktır.
dbugger

80
Sadece açıklığa kavuşturmak için - komuttan "NOT NULL" atlanırsa, mevcut satırların değeri güncellenmez ve NULL olarak kalır. Komutta "NOT NULL" varsa, mevcut satırların değeri varsayılan değerle eşleşecek şekilde güncellenecektir.
Stack Man

15
Birden çok sütun için ALTER TABLE tablo_1 col_1 int EKLE BOŞ DEĞER DEĞİL (1), sütun_2 int NULL
aads 4:13

233

Bir eklerken null sütun , WITH VALUESbelirli 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

13
Bu kilit nokta. DEFAULTKısıtlamalı bir sütunun her zaman bir değere sahip olacağını varsaymak kolaydır - yani, NOT NULLbelirtilmemiş olsa bile NULL değil.
Bill Brinkley

6
@tkocmathla uh, BITveri türü hakkında konuşmuyordum , bu özel BIT sütun hakkında konuşuyordum . Cevaba bak, sütun olarak bildirildi NOT NULL.
rsenna

136
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

7
Tablonun zaten içeriği varsa bu işe yaramaz, çünkü varsayılan değer kısıtlamasından önce yeni "boş değer yok" sütunu oluşturulmuştur
WDuffy

129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

13
önce bu boş olmalı
baaroz

5
@baaroz, bu NOT NULL ile çalışır: ALTER TABLE MYTABLE MYNEWCOLUMN VARCHAR (200) NOT NULL DEFAULT 'SNUGGLES'
shaijut

100

Eklediğiniz sütunun bir NOT NULLkısıtlaması olduğunda, ancak bir DEFAULTkısıtlaması (değeri) olmadığında dikkat edin . ALTER TABLETablo içinde herhangi bir satır varsa deyimi bu durumda başarısız olacaktır. Çözüm, ya NOT NULLkısıtlamayı yeni sütundan kaldırmak ya da bunun için bir DEFAULTkısıtlama sağlamaktır .


2
herhangi bir SQL örneği ?
Kiquenet

98

Yalnızca iki satırlı en temel sürüm

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

81

kullanın:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())  
GO 

79

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


54

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.


52

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();''' ;

50

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.


48

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]

1
Bakım kolaylığı için kısıtlamayı standart bir adlandırma şeması (örn. "DF_Table_Column") kullanarak açıkça adlandıran FYI. Aksi takdirde, kısıtlamayı bulmak daha fazla çalışma gerektirir.
Mike Christian

43

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.

  1. Tablonuzu tasarım görünümüne yerleştirin (Nesne gezgininde tabloya sağ tıklayın-> Tasarım)
  2. Tabloya bir sütun ekleyin (veya zaten varsa güncellemek istediğiniz sütuna tıklayın)
  3. Sütun özellikleri aşağıda girmek (getdate())ya abcya 0ya sen istedikleri değeri Standart Değer veya Cilt aşağıdaki resimde gösterilen alana:

resim açıklamasını buraya girin



31

Misal:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO


22

Önce öğrenci adıyla bir tablo oluşturun:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Bir sütun ekleyin:

ALTER TABLE STUDENT 
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)

SELECT * 
FROM STUDENT

Tablo oluşturulur ve var olan bir tabloya varsayılan değeri olan bir sütun eklenir.

Resim 1


19

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


18

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))

18
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

3
NOT EXISTSMasayı 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.
Michael Gaskill

17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

Belki görüntüyü gerçek kodla değiştirebilir? Olduğu gibi kopyalamak ve yapıştırmak zor.
David Faber

6
Bu, yıllar önce var olan cevaplara herhangi bir değer katmaz.
nvoigt

14

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

13

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

7
Bu, yıllar önce var olan cevaplara herhangi bir değer katmaz.
nvoigt

11

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

10

Aşağıdaki sorguyu deneyin:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Bu, Tabloya yeni bir sütun ekleyecektir.


6
bu soru için başka bir kullanıcı tarafından verilen bu cevap
janith1024

9
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.


9

Ş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 TaskSheetbelirli tablo adı ve IsBilledToClientekleyeceğiniz yeni sütun ve 1varsayı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, IsBilledToClientsü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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.