Thêm một cột có giá trị mặc định vào bảng hiện có trong SQL Server


Câu trả lời:


3498

Cú pháp:

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

Thí dụ:

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.

Ghi chú:

Tên ràng buộc tùy chọn:
Nếu bạn rời khỏi CONSTRAINT D_SomeTable_SomeColthì SQL Server sẽ tự động tạo ra
    một Chống chỉ định mặc định với một tên vui như:DF__SomeTa__SomeC__4FB7FEF6

Tùy chọn Statement Với-Giá trị:
Các WITH VALUESchỉ là cần thiết khi cột của bạn là Nullable
    và bạn muốn mặc định giá trị sử dụng cho hồ sơ hiện tại.
Nếu Cột của bạn là NOT NULL, thì nó sẽ tự động sử dụng Giá trị mặc định
    cho tất cả các Bản ghi hiện có, cho dù bạn có chỉ định WITH VALUEShay không.

Cách thức chèn chèn hoạt động với ràng buộc mặc định:
Nếu bạn chèn Bản ghi vào SomeTablekhông chỉ định SomeColgiá trị, thì nó sẽ Mặc định 0.
Nếu bạn chèn một Bản ghi Chỉ định SomeColgiá trị là NULL(và cột của bạn cho phép null),
    thì Ràng buộc mặc định sẽ không được sử dụng và NULLsẽ được chèn làm Giá trị.

Ghi chú được dựa trên phản hồi tuyệt vời của mọi người dưới đây.
Cảm ơn đặc biệt đến:
    @Yatrix, @WalterStabosz, @YahooSerious và @StackMan vì những bình luận của họ.


332
Hãy nhớ rằng nếu cột là null, thì null sẽ là giá trị được sử dụng cho các hàng hiện có.
Richard Collette

17
@Thecrocodhunter Cột Nullable có nghĩa là bạn có thể chèn Null cho giá trị cột. Nếu đó không phải là cột rỗng, bạn phải chèn một số giá trị của kiểu dữ liệu đó. Vì vậy, đối với các bản ghi hiện có, Null sẽ được chèn vào chúng và trong các bản ghi mới, giá trị mặc định của bạn sẽ được chèn trừ khi có quy định khác. Có lý?
Yatrix

41
Tôi thích câu trả lời này tốt hơn một chút so với dbugger vì nó đặt tên rõ ràng cho ràng buộc mặc định. Một ràng buộc mặc định vẫn được tạo bằng cú pháp của dbugger, ngoại trừ tên của nó được tạo tự động. Biết tên chính xác sẽ có ích khi viết các tập lệnh DROP-CREATE.
Walter Stabosz

18
@Vertigo Điều đó chỉ đúng nếu cột là NOT NULL. Vui lòng thử điều này: 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;Bạn sẽ thấy 2 giá trị NULL cho cột b.
ErikE

48
Sử dụng WITH VALUESđể cập nhật các hàng nullable hiện có. Xem MSDN : "Nếu cột được thêm cho phép giá trị null và WITH VALUESđược chỉ định, giá trị mặc định được lưu trữ trong cột mới, được thêm vào các hàng hiện có."
Yahoo Nghiêm

1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

Việc bao gồm DEFAULT sẽ điền vào cột trong các hàng hiện có với giá trị mặc định, do đó, ràng buộc KHÔNG NULL không bị vi phạm.


13
Vấn đề với câu trả lời đó là giá trị mặc định chỉ hợp lệ cho các bản ghi mới. Các hồ sơ hiện tại vẫn sẽ có giá trị NULL.
Roee Gavirel

130
Bạn sẽ thấy đó không phải là trường hợp. Nếu không, các ràng buộc sẽ bị vi phạm.
dbugger

35
Các cột trong các hàng hiện có được điền với giá trị mặc định. Một thử nghiệm nhỏ theo kinh nghiệm sẽ chứng minh điều đó.
dbugger

80
Chỉ cần làm rõ - nếu "KHÔNG NULL" bị bỏ qua khỏi lệnh, giá trị cho các hàng hiện tại sẽ KHÔNG được cập nhật và sẽ vẫn là NULL. Nếu "KHÔNG NULL" được bao gồm trong lệnh, giá trị cho các hàng hiện tại SILL được cập nhật để khớp với mặc định.
Stack Man

15
Đối với nhiều cột ALTER TABLE bảng_1 ADD col_1 int KHÔNG NULL DEFAULT (1), col_2 int NULL
aads

233

Khi thêm một cột không thể , WITH VALUESsẽ đảm bảo rằng giá trị DEFAULT cụ thể được áp dụng cho các hàng hiện có:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

13
Đây là một điểm quan trọng. Thật dễ dàng để giả định một cột có DEFAULTràng buộc sẽ luôn có một giá trị - nghĩa là, không phải là NULL, mặc dù NOT NULLkhông được chỉ định.
Bill Brinkley

6
@tkocmathla uh, tôi không nói về BITkiểu dữ liệu, tôi đã nói về BIT cột đặc biệt này . Nhìn vào câu trả lời, cột được khai báo là 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
Điều này sẽ không hoạt động nếu bảng đã có nội dung vì cột "không thể rỗng" mới được tạo trước ràng buộc giá trị mặc định
WDuffy

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

13
điều này thêm null! phải không null trước đây
baaroz

5
@baaroz, cái này hoạt động với KHÔNG NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) KHÔNG NULL DEFAULT 'SNUGGLES'
shaijut 22/215

100

Cẩn thận khi cột bạn đang thêm có một NOT NULLràng buộc, nhưng không có DEFAULTràng buộc (giá trị). Câu ALTER TABLElệnh sẽ thất bại trong trường hợp đó nếu bảng có bất kỳ hàng nào trong đó. Giải pháp là loại bỏ NOT NULLràng buộc khỏi cột mới hoặc cung cấp DEFAULTràng buộc cho nó.


2
bất kỳ mẫu SQL nào về nó?
Kiquenet

98

Phiên bản cơ bản nhất chỉ có hai dòng

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

81

Sử dụng:

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

Nếu bạn muốn thêm nhiều cột, bạn có thể làm theo cách này chẳng hạn:

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


54

Để thêm một cột vào bảng cơ sở dữ liệu hiện có với giá trị mặc định, chúng ta có thể sử dụng:

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

Đây là một cách khác để thêm một cột vào bảng cơ sở dữ liệu hiện có với giá trị mặc định.

Một tập lệnh SQL kỹ lưỡng hơn nhiều để thêm một cột có giá trị mặc định bên dưới bao gồm kiểm tra xem cột có tồn tại hay không trước khi thêm nó cũng kiểm tra ràng buộc và thả nó nếu có. Kịch bản lệnh này cũng đặt tên cho ràng buộc để chúng ta có thể có một quy ước đặt tên đẹp (tôi thích DF_) và nếu không SQL sẽ cung cấp cho chúng ta một ràng buộc với một tên có số được tạo ngẫu nhiên; vì vậy thật tuyệt khi có thể đặt tên cho các ràng buộc quá.

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

Đây là hai cách để thêm một cột vào bảng cơ sở dữ liệu hiện có với giá trị mặc định.


52

Bạn có thể làm điều đó với T-SQL theo cách sau.

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

Cũng như bạn có thể sử dụng SQL Server Management Studio bằng cách nhấp chuột phải vào bảng trong menu Thiết kế, đặt giá trị mặc định thành bảng.

Và hơn nữa, nếu bạn muốn thêm cùng một cột (nếu nó không tồn tại) vào tất cả các bảng trong cơ sở dữ liệu, thì hãy sử dụng:

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

50

Trong SQL Server 2008-R2, tôi chuyển sang chế độ thiết kế - trong cơ sở dữ liệu thử nghiệm - và thêm hai cột của tôi bằng trình thiết kế và thực hiện cài đặt với GUI, sau đó tên khét tiếng Right-Clickđưa ra tùy chọn " Tạo tập lệnh thay đổi "!

Bang up hiện ra một cửa sổ nhỏ, bạn đoán nó, tập lệnh thay đổi được bảo đảm định dạng đúng công việc. Nhấn nút dễ dàng.


48

Ngoài ra, bạn có thể thêm một mặc định mà không cần phải đặt tên rõ ràng cho ràng buộc:

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

Nếu bạn gặp sự cố với các ràng buộc mặc định hiện có khi tạo ràng buộc này thì có thể xóa chúng bằng cách:

alter table [schema].[tablename] drop constraint [constraintname]

1
FYI, đặt tên rõ ràng ràng buộc bằng cách sử dụng lược đồ đặt tên tiêu chuẩn (ví dụ: "DF_Table_Column"), để dễ bảo trì. Nếu không, việc định vị các ràng buộc đòi hỏi nhiều công việc hơn.
Mike Christian

43

Điều này cũng có thể được thực hiện trong GUI SSMS. Tôi hiển thị một ngày mặc định bên dưới nhưng tất nhiên giá trị có thể là bất cứ điều gì.

  1. Đặt bảng của bạn trong dạng xem thiết kế (Nhấp chuột phải vào bảng trong trình thám hiểm đối tượng-> Thiết kế)
  2. Thêm một cột vào bảng (hoặc nhấp vào cột bạn muốn cập nhật nếu nó đã tồn tại)
  3. Trong Thuộc tính Cột bên dưới, nhập (getdate())hoặc abchoặc 0bất kỳ giá trị nào bạn muốn trong trường Giá trị mặc định hoặc Liên kết như trong hình dưới đây:

nhập mô tả hình ảnh ở đây



31

Thí dụ:

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


22

Đầu tiên tạo một bảng có tên sinh viên:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Thêm một cột vào nó:

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

SELECT * 
FROM STUDENT

Bảng được tạo và một cột được thêm vào bảng hiện có với giá trị mặc định.

Hình 1


19

Điều này có rất nhiều câu trả lời, nhưng tôi cảm thấy cần phải thêm phương pháp mở rộng này. Việc này có vẻ lâu hơn rất nhiều, nhưng nó cực kỳ hữu ích nếu bạn thêm trường KHÔNG NULL vào bảng có hàng triệu hàng trong cơ sở dữ liệu đang hoạt động.

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

Điều này sẽ làm là thêm cột dưới dạng trường không thể và với giá trị mặc định, cập nhật tất cả các trường thành giá trị mặc định (hoặc bạn có thể gán các giá trị có ý nghĩa hơn) và cuối cùng nó sẽ thay đổi cột thành KHÔNG NULL.

Lý do cho điều này là nếu bạn cập nhật một bảng tỷ lệ lớn và thêm một trường không null mới, nó phải ghi vào từng hàng và sau đó sẽ khóa toàn bộ bảng khi thêm cột và sau đó ghi tất cả các giá trị.

Phương pháp này sẽ thêm cột nullable hoạt động nhanh hơn rất nhiều, sau đó điền dữ liệu trước khi đặt trạng thái không null.

Tôi đã thấy rằng thực hiện toàn bộ điều trong một tuyên bố sẽ khóa một trong những bảng hoạt động nhiều hơn của chúng tôi trong 4-8 phút và thường thì tôi đã giết quá trình. Phương pháp này mỗi phần thường chỉ mất vài giây và gây ra khóa tối thiểu.

Ngoài ra, nếu bạn có một bảng trong khu vực hàng tỷ hàng, có thể đáng để thực hiện cập nhật như sau:

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

    IF @@ROWCOUNT < 1000000
        BREAK;
END


18

Máy chủ SQL + Bảng thay đổi + Thêm cột + Định danh duy nhất giá trị mặc định

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
Tôi thích NOT EXISTSkiểm tra trước khi cố gắng thay đổi bảng. Giải pháp rất tốt. Một số bình luận bổ sung về cách thức này hoạt động sẽ làm cho nó thậm chí còn hữu ích hơn.
Michael Gaskill

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

Có thể thay thế hình ảnh bằng mã thực tế? Khó sao chép và dán nguyên trạng.
David Faber

6
Điều này không thêm bất kỳ giá trị nào so với các câu trả lời đã có từ nhiều năm trước.
nvoigt

14

Thêm một cột mới vào bảng:

ALTER TABLE [table]
ADD Column1 Datatype

Ví dụ,

ALTER TABLE [test]
ADD ID Int

Nếu người dùng muốn làm cho nó tự động tăng lên thì:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL

13

Cái này dành cho SQL Server:

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

Thí dụ:

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

Nếu bạn muốn thêm các ràng buộc thì:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES

7
Điều này không thêm bất kỳ giá trị nào so với các câu trả lời đã có từ nhiều năm trước.
nvoigt

11

Điều này có thể được thực hiện bằng mã dưới đây.

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

Hãy thử với truy vấn dưới đây:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Điều này sẽ thêm một cột mới vào Bảng.


6
câu trả lời này được đưa ra bởi một người dùng khác cho câu hỏi này
janith1024

9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Từ truy vấn này, bạn có thể thêm một cột số nguyên kiểu dữ liệu với giá trị mặc định 0.


9

Vâng, bây giờ tôi có một số sửa đổi cho câu trả lời trước đây của tôi. Tôi đã nhận thấy rằng không có câu trả lời được đề cập IF NOT EXISTS. Vì vậy, tôi sẽ cung cấp một giải pháp mới của nó vì tôi đã phải đối mặt với một số vấn đề thay đổi bảng.

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

Đây TaskSheetlà tên bảng cụ thể và IsBilledToClientlà cột mới mà bạn sẽ chèn và 1giá trị mặc định. Điều đó có nghĩa là trong cột mới, giá trị của các hàng hiện tại sẽ là gì, do đó, một hàng sẽ được đặt tự động ở đó. Tuy nhiên, bạn có thể thay đổi theo ý muốn với sự tôn trọng của loại cột như tôi đã sử dụngBIT , vì vậy tôi đặt giá trị mặc định 1.

Tôi đề nghị hệ thống trên, bởi vì tôi đã phải đối mặt với một vấn đề. Vì vậy, vấn đề là gì? Vấn đề là, nếu IsBilledToClientcột tồn tại trong bảng bảng thì nếu bạn chỉ thực thi phần mã được đưa ra bên dưới, bạn sẽ thấy lỗi trong trình tạo truy vấn máy chủ SQL. Nhưng nếu nó không tồn tại thì lần đầu tiên sẽ không có lỗi khi thực thi.

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.