2013-03-21 87 views
24

Tôi đang cố gắng thay đổi giá trị mặc định của cột bằng cách sử dụng câu lệnh SQL trong SQL Server 2008. Tôi đã tìm thấy ở nhiều nơi cách đặt giá trị mặc định khi bạn tạo bảng/thêm một cột nhưng không làm thế nào để đặt nó/sửa đổi nó một khi cột đã tồn tại.Sửa đổi giá trị mặc định trong SQL Server

Đây là những gì tôi có thể sử dụng để thiết lập nó trên nói thêm:

ALTER TABLE MyTable ADD MyColumn int NOT NULL DEFAULT 0 

Và đó hoạt động, nhưng nếu tôi cố gắng thay đổi nó sau này:

ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL DEFAULT -1 
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL SET DEFAULT -1 

Không ai trong số đó là những cú pháp đúng, và tôi không tìm thấy cú pháp để làm những gì tôi giả vờ ở bất cứ đâu. Tùy chọn duy nhất tôi đi kèm là thêm cột mới, sao chép giá trị từ cột trước đó, sau đó xóa cột trước đó và cột mới để thực hiện thay đổi, nhưng điều đó dường như không đúng với tôi.

Có cách nào để làm những gì tôi muốn chỉ trong một câu đơn giản không?

Cảm ơn.

Trả lời

45

Khi bạn thêm một cột với giá trị mặc định, những gì xảy ra là có một hạn chế mặc định được thêm vào:

create table _temp 
(x int default 1) 

sp_help kết quả:

constraint_type constraint_name 
DEFAULT on column x DF___temp__x__5A3B20F9 

Vì vậy, mệnh đề này là một lối tắt để tạo ràng buộc. Nếu bạn muốn thay đổi mặc định cho cột đã tồn tại, bạn phải thả các hạn chế đầu tiên:

alter table _temp drop constraint DF___temp__x__5A3B20F9 

Và sau đó tạo ra một hạn chế mặc định mới:

alter table _temp add constraint DF_temp_x default 2 for x 
+9

Tôi sẽ chỉ thêm làm thế nào để có được các tên hạn chế để giải thích của bạn: CHỌN TÊN FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID ('dbo.MyTable'); Việc thực hiện điều đó sẽ giúp bạn biết được ràng buộc nào cần xóa/thêm lần nữa. –

+4

Điều này cho thấy rõ ràng lý do tại sao nó rất quan trọng để ** một cách rõ ràng tên ** hạn chế của bạn! Hãy tưởng tượng bạn muốn bỏ ràng buộc này ....sẽ dễ dàng hơn bao nhiêu nếu bạn biết nó được gọi là 'DF_Temp_X' (thay vì hệ thống tạo ra' DF ___ temp__x__5A3B20F9') –

+3

@ Ruben.Canton: "sp_help TABLE_NAME" cũng vậy. –

10

Bạn nên thả các hạn chế DEFAULT và thêm một cái mới như thế này

alter table Mytable 
drop constraint <constraint name> 
go 
alter table MyTable 
add constraint df_MyTable_MyColumn default -1 for MyColumn 
go 

Sử dụng sp_helpconstraint MyTable để có được tên chế

+0

Tôi hiểu ngay bây giờ, các trang khác cũng nói về ràng buộc nhưng tôi không đọc chi tiết và tìm kiếm tại các phát biểu tôi nghĩ rằng nó đang trả lời một cái gì đó khác nhau. Cảm ơn bạn đã làm rõ. –

5

DEFAULT là một hạn chế. Bạn muốn sử dụng ALTER TABLE ADD CONSTRAINT.

ALTER TABLE MyTable 
ADD CONSTRAINT <constraint name> 
DEFAULT -1 FOR MyColumn 

Bạn sẽ cần phải thả các hạn chế hiện đầu tiên, như:

ALTER TABLE MyTable 
DROP CONSTRAINT <constraint name> 
22
DECLARE @Command nvarchar(max), @ConstaintName nvarchar(max), @TableName nvarchar(max),@ColumnName nvarchar(max) 
SET @TableName = 'TableName' 
SET @ColumnName ='ColumnName' 
SELECT @ConstaintName = name 
    FROM sys.default_constraints 
    WHERE parent_object_id = object_id(@TableName) 
     AND parent_column_id = columnproperty(object_id(@TableName), @ColumnName, 'ColumnId') 

SELECT @Command = 'ALTER TABLE '[email protected]+' drop constraint '+ @ConstaintName 

IF @Command IS NOT NULL 
BEGIN 
    EXECUTE sp_executeSQL @Command 
    SELECT @Command = 'ALTER TABLE '[email protected]+' ADD CONSTRAINT '[email protected]+' DEFAULT 1 FOR ' + @ColumnName 
    EXECUTE sp_executeSQL @Command 
END 
+5

Không biết tại sao điều này lại bị bỏ phiếu. Điều này có vẻ là một giải pháp khá ... –

+2

@LukasEder Có thể là phản ứng với số lượng mã SQL Server yêu cầu giảm giá trị mặc định khi tên ràng buộc được tạo ra hệ thống, so với ví dụ: PostgreSQL: ALTER TABLE Tên bảng ALTER COLUMN ColumnName DROP DEFAULT; – MrBackend

0

Thêm giá trị mặc định cho cột nếu nó không tồn tại

DECLARE @defaultLock VARCHAR(100) 
SELECT @defaultLock = (SELECT object_definition(default_object_id) AS definition FROM sys.columns WHERE name = 'Lock' AND object_id = object_id('dbo.Positions')) 
    IF @defaultLock IS NULL 
     ALTER TABLE Positions ADD DEFAULT (0) FOR Lock 
Các vấn đề liên quan