Tambahkan kolom dengan nilai default ke tabel yang ada di SQL Server

Jawaban:

3498

Sintaksis:

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

Contoh:

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.

Catatan:

Opstraint Name Opsional:
Jika Anda keluar CONSTRAINT D_SomeTable_SomeColmaka SQL Server akan membuat autogenerate
    Default-Contraint dengan Nama lucu seperti:DF__SomeTa__SomeC__4FB7FEF6

Opsional Dengan-Nilai Pernyataan:
The WITH VALUEShanya diperlukan bila Kolom Anda Nullable
    dan Anda ingin Default Nilai digunakan untuk yang ada Records.
Jika Kolom Anda NOT NULL, maka itu akan secara otomatis menggunakan Nilai Default
    untuk semua Catatan yang Ada, apakah Anda menentukan WITH VALUESatau tidak.

Bagaimana Sisipan bekerja dengan Batasan-Default:
Jika Anda memasukkan Catatan ke SomeTabledan tidak MenentukanSomeCol nilai, maka akan menjadi Default untuk 0.
Jika Anda memasukkan Rekam dan Tentukan SomeColnilai sebagai NULL(dan kolom Anda memungkinkan nol),
    maka Batasan Default tidak akan digunakan dan NULLakan dimasukkan sebagai Nilai.

Catatan didasarkan pada tanggapan semua orang di bawah ini.
Terima kasih khusus kepada
    @Yatrix, @WalterStabosz, @YahooSerious, dan @StackMan atas komentar mereka.

James Boother
sumber
332
Perlu diingat bahwa jika kolom tersebut nullable, maka null akan menjadi nilai yang digunakan untuk baris yang ada.
Richard Collette
17
@Thecrocodilehunter Kolom Nullable berarti Anda dapat memasukkan Null untuk nilai kolom. Jika bukan kolom yang dapat dibatalkan, Anda harus memasukkan beberapa nilai tipe data itu. Jadi, untuk catatan yang ada, Null akan dimasukkan di dalamnya dan dalam catatan baru, nilai default Anda akan dimasukkan kecuali ditentukan lain. Masuk akal?
Yatrix
41
Saya suka jawaban ini sedikit lebih baik daripada dbugger karena secara eksplisit menyebutkan batasan default. Kendala default masih dibuat menggunakan sintaks dbugger, kecuali namanya dihasilkan secara otomatis. Mengetahui nama persisnya berguna saat menulis skrip DROP-CREATE.
Walter Stabosz
18
@Vertigo HANYA benar jika kolomnya NOT NULL. Silakan coba ini: 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;Anda akan melihat 2 nilai NULL untuk kolom b.
ErikE
48
Gunakan WITH VALUESuntuk memperbarui baris nullable yang ada. Lihat MSDN : "Jika kolom yang ditambahkan memungkinkan nilai nol dan WITH VALUESditentukan, nilai default disimpan di kolom baru, ditambahkan ke baris yang ada."
Yahoo Serius
1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

Dimasukkannya DEFAULT mengisi kolom di baris yang ada dengan nilai default, sehingga batasan NOT NULL tidak dilanggar.

dbugger
sumber
13
Masalah dengan jawaban itu adalah bahwa nilai default hanya valid untuk catatan baru. Catatan yang ada masih akan memiliki nilai NULL.
Roee Gavirel
130
Anda akan menemukan bahwa bukan itu masalahnya. Kalau tidak, kendala akan dilanggar.
dbugger
35
Kolom di baris yang ada diisi dengan nilai default. Tes empiris kecil akan membuktikannya.
dbugger
80
Hanya untuk memperjelas - jika "NOT NULL" dihilangkan dari perintah, nilai untuk baris yang ada TIDAK akan diperbarui dan akan tetap NULL. Jika "NOT NULL" dimasukkan dalam perintah, nilai untuk baris yang ada AKAN diperbarui untuk mencocokkan dengan default.
Stack Man
15
Untuk beberapa kolom ALTER TABEL tabel_1 TAMBAHKAN col_1 int BUKAN NULL DEFAULT (1), col_2 int NULL
aads
233

Saat menambahkan kolom nullable , WITH VALUESakan memastikan bahwa nilai DEFAULT spesifik diterapkan ke baris yang ada:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
phunk_munkie
sumber
13
Ini adalah titik kunci. Sangat mudah untuk menganggap kolom dengan DEFAULTbatasan akan selalu memiliki nilai - yaitu, bukan NULL, meskipun NOT NULLtidak ditentukan.
Bill Brinkley
6
@tkocmathla eh, saya tidak berbicara tentang BITtipe data, saya sedang berbicara tentang BIT kolom khusus ini . Lihatlah jawabannya, kolomnya dinyatakan sebagai 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
ddc0660
sumber
7
Ini tidak akan berfungsi jika tabel sudah memiliki konten karena kolom "tidak nullable" baru dibuat sebelum batasan nilai default
WDuffy
129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Evan V
sumber
13
ini tambahkan null! Tidak boleh nol sebelum
baaroz
5
@baaroz, ini bekerja dengan NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) BUKAN NULL 'SNUGGLES'
shaijut
100

Waspadalah ketika kolom yang Anda tambahkan memiliki NOT NULLkendala, namun tidak memiliki DEFAULTkendala (nilai). The ALTER TABLEpernyataan akan gagal dalam kasus itu jika tabel memiliki baris di dalamnya. Solusinya adalah dengan menghapus NOT NULLkendala dari kolom baru, atau memberikan DEFAULTkendala untuk itu.

jalbert
sumber
2
ada sampel SQL tentang itu?
Kiquenet
98

Versi paling dasar dengan dua baris saja

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
adeel41
sumber
81

Menggunakan:

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

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

Jika Anda ingin menambahkan beberapa kolom, Anda dapat melakukannya dengan cara ini misalnya:

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO
Gabriel L.
sumber
56

Menggunakan:

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

Referensi: ALTER TABLE (Transact-SQL) (MSDN)

lalu
sumber
54

Untuk menambahkan kolom ke tabel database yang ada dengan nilai default, kita dapat menggunakan:

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

Berikut ini cara lain untuk menambahkan kolom ke tabel database yang ada dengan nilai default.

Skrip SQL yang jauh lebih menyeluruh untuk menambahkan kolom dengan nilai default di bawah ini termasuk memeriksa apakah kolom itu ada sebelum menambahkannya juga checkin kendala dan menjatuhkannya jika ada. Script ini juga memberi nama batasan sehingga kita dapat memiliki konvensi penamaan yang bagus (saya suka DF_) dan jika tidak SQL akan memberi kita batasan dengan nama yang memiliki nomor yang dihasilkan secara acak; jadi senang bisa menyebutkan batasannya juga.

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

Ini adalah dua cara untuk menambahkan kolom ke tabel database yang ada dengan nilai default.

Catto
sumber
52

Anda dapat melakukan hal itu dengan T-SQL dengan cara berikut.

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

Serta Anda dapat menggunakan SQL Server Management Studio juga dengan mengklik kanan tabel di menu Desain, mengatur nilai default ke tabel.

Dan selanjutnya, jika Anda ingin menambahkan kolom yang sama (jika tidak ada) ke semua tabel dalam database, maka gunakan:

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
gngolakia
sumber
50

Dalam SQL Server 2008-R2, saya pergi ke mode desain - dalam database pengujian - dan menambahkan dua kolom saya menggunakan desainer dan membuat pengaturan dengan GUI, dan kemudian yang terkenal Right-Clickmemberi pilihan " Hasilkan Ubah Script "!

Bang up muncul jendela kecil dengan, Anda dapat menebaknya, skrip perubahan dijamin untuk bekerja yang diformat dengan benar. Tekan tombol mudah.

Mendongkrak
sumber
48

Atau, Anda dapat menambahkan default tanpa harus memberi nama batasan secara eksplisit:

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

Jika Anda memiliki masalah dengan batasan default yang ada saat membuat batasan ini maka mereka dapat dihilangkan dengan:

alter table [schema].[tablename] drop constraint [constraintname]
Christo
sumber
1
FYI, secara eksplisit memberi nama kendala menggunakan skema penamaan standar (misalnya "DF_Table_Column"), untuk kemudahan pemeliharaan. Kalau tidak, menemukan kendala membutuhkan lebih banyak pekerjaan.
Mike Christian
43

Ini dapat dilakukan di GUI SSMS juga. Saya menunjukkan tanggal default di bawah ini, tetapi nilai defaultnya bisa berapa saja, tentu saja.

  1. Letakkan meja Anda di tampilan desain (Klik kanan pada tabel di objek explorer-> Desain)
  2. Tambahkan kolom ke tabel (atau klik pada kolom yang ingin Anda perbarui jika sudah ada)
  3. Dalam Properti Kolom di bawah, masukkan (getdate())atau abcatau 0atau nilai apa pun yang Anda inginkan di bidang Nilai Default atau Binding seperti yang digambarkan di bawah ini:

masukkan deskripsi gambar di sini

Tony L.
sumber
39
ALTER TABLE ADD ColumnName {Column_Type} Constraint

Artikel MSDN ALTER TABLE (Transact-SQL) memiliki semua sintaks tabel alter.

Benjamin Autin
sumber
31

Contoh:

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

Contoh:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
Mohit Tamrakar
sumber
22

Pertama-tama buat tabel dengan nama siswa:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Tambahkan satu kolom ke dalamnya:

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

SELECT * 
FROM STUDENT

Tabel dibuat dan kolom ditambahkan ke tabel yang ada dengan nilai default.

Gambar 1

Laxmi
sumber
19

Ini memiliki banyak jawaban, tetapi saya merasa perlu menambahkan metode yang diperluas ini. Ini tampaknya jauh lebih lama, tetapi ini sangat berguna jika Anda menambahkan bidang NOT NULL ke tabel dengan jutaan baris dalam database aktif.

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

Apa yang akan dilakukan adalah menambahkan kolom sebagai bidang yang dapat dibatalkan dan dengan nilai default, perbarui semua bidang ke nilai default (atau Anda dapat menetapkan nilai yang lebih bermakna), dan akhirnya akan mengubah kolom menjadi TIDAK NULL.

Alasan untuk ini adalah jika Anda memperbarui tabel skala besar dan menambahkan bidang bukan nol yang baru ia harus menulis ke setiap baris dan dengan ini akan mengunci seluruh tabel saat menambahkan kolom dan kemudian menulis semua nilai.

Metode ini akan menambahkan kolom nullable yang beroperasi jauh lebih cepat dengan sendirinya, kemudian mengisi data sebelum menetapkan status bukan nol.

Saya telah menemukan bahwa melakukan seluruh hal dalam satu pernyataan akan mengunci salah satu tabel kami yang lebih aktif selama 4-8 menit dan cukup sering saya membunuh prosesnya. Metode ini setiap bagian biasanya hanya membutuhkan beberapa detik dan menyebabkan penguncian minimal.

Selain itu, jika Anda memiliki tabel di bidang miliaran baris, mungkin layak untuk mengelompokkan pembaruan seperti:

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END
Ste Bov
sumber
18

Coba ini

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
Jakir Hossain
sumber
18

SQL Server + Alter Table + Tambahkan Kolom + Nilai Default uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
Naveen Desosha
sumber
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
Jeevan Gharti
sumber
3
Saya suka NOT EXISTScek sebelum mencoba mengubah tabel. Solusi yang sangat bagus Beberapa komentar tambahan tentang cara kerjanya akan membuatnya lebih bermanfaat.
Michael Gaskill
17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
pembuat kode liar
sumber
Mungkin mengganti gambar dengan kode aktual? Sulit untuk menyalin dan menempel apa adanya.
David Faber
6
Ini tidak menambah nilai apa pun atas jawaban yang sudah ada dari tahun lalu.
nvoigt
14

Tambahkan kolom baru ke tabel:

ALTER TABLE [table]
ADD Column1 Datatype

Sebagai contoh,

ALTER TABLE [test]
ADD ID Int

Jika pengguna ingin menambahkannya secara otomatis, maka:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Chirag Thakar
sumber
13

Ini untuk SQL Server:

ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES

Contoh:

ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES

Jika Anda ingin menambahkan kendala maka:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Akhil Singh
sumber
7
Ini tidak menambah nilai apa pun atas jawaban yang sudah ada dari tahun lalu.
nvoigt
11

Ini dapat dilakukan dengan kode di bawah ini.

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
Mohit Dagar
sumber
10

Coba dengan kueri di bawah ini:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Ini akan menambahkan kolom baru ke dalam Tabel.

Anshul Dubey
sumber
6
jawaban ini diberikan oleh pengguna lain untuk pertanyaan ini
janith1024
9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Dari kueri ini Anda bisa menambahkan kolom integer datatype dengan nilai default 0.

Sandeep Kumar
sumber
9

Nah, sekarang saya memiliki beberapa modifikasi pada jawaban saya sebelumnya. Saya perhatikan bahwa tidak ada jawaban yang disebutkan IF NOT EXISTS. Jadi saya akan memberikan solusi baru karena saya telah menghadapi beberapa masalah mengubah tabel.

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

Ini TaskSheetadalah nama tabel tertentu dan IsBilledToClientmerupakan kolom baru yang akan Anda sisipkan dan 1nilai default. Itu berarti di kolom baru apa yang akan menjadi nilai dari baris yang ada, oleh karena itu satu akan ditetapkan secara otomatis di sana. Namun, Anda dapat mengubah sesuai keinginan dengan menghormati jenis kolom seperti yang saya gunakan BIT, jadi saya memasukkan nilai default 1.

Saya menyarankan sistem di atas, karena saya menghadapi masalah. Jadi apa masalahnya? Masalahnya adalah, jika IsBilledToClientkolom memang ada dalam tabel tabel maka jika Anda hanya menjalankan bagian dari kode yang diberikan di bawah ini Anda akan melihat kesalahan dalam pembangun kueri SQL server. Tetapi jika tidak ada maka untuk pertama kalinya tidak akan ada kesalahan saat mengeksekusi.

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