Làm cách nào tôi có thể thêm một cột có giá trị mặc định vào bảng hiện có trong SQL Server 2000 / SQL Server 2005 ?
Làm cách nào tôi có thể thêm một cột có giá trị mặc định vào bảng hiện có trong SQL Server 2000 / SQL Server 2005 ?
Câu trả lời:
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.
Tên ràng buộc tùy chọn:
Nếu bạn rời khỏi CONSTRAINT D_SomeTable_SomeCol
thì 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 VALUES
chỉ 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 VALUES
hay 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 SomeTable
và không chỉ định SomeCol
giá trị, thì nó sẽ Mặc định 0
.
Nếu bạn chèn một Bản ghi và Chỉ định SomeCol
giá 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à NULL
sẽ đượ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ọ.
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
.
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ó."
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.
Khi thêm một cột không thể , WITH VALUES
sẽ đả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
DEFAULT
ràng buộc sẽ luôn có một giá trị - nghĩa là, không phải là NULL, mặc dù NOT NULL
không được chỉ định.
BIT
kiể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
.
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
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Cẩn thận khi cột bạn đang thêm có một NOT NULL
ràng buộc, nhưng không có DEFAULT
ràng buộc (giá trị). Câu ALTER TABLE
lệ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 NULL
ràng buộc khỏi cột mới hoặc cung cấp DEFAULT
ràng buộc cho nó.
Sử dụng:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Tham khảo: ALTER TABLE (Transact-SQL) (MSDN)
Để 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.
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();''' ;
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.
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]
Đ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ì.
(getdate())
hoặc abc
hoặc 0
bấ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:ALTER TABLE ADD ColumnName {Column_Type} Constraint
Bài viết MSDN ALTER TABLE (Transact-SQL) có tất cả các cú pháp bảng thay đổi.
Thí dụ:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
Đ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
Thử cái này
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
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))
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
kiể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.
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
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
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
Đ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
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.
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.
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 TaskSheet
là tên bảng cụ thể và IsBilledToClient
là cột mới mà bạn sẽ chèn và 1
giá 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 IsBilledToClient
cộ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]