2014-09-12 20 views
15

Tôi biết bạn có thể thay đổi giá trị mặc định của một cột hiện có như this:Alter giá trị cột mặc định

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn; 

Nhưng theo this truy vấn của tôi phải làm việc:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL 
     CONSTRAINT DF_Constraint DEFAULT GetDate() 

Vì vậy, ở đây tôi' m cố gắng để làm cho cột của tôi Không Null và cũng thiết lập giá trị mặc định. Nhưng nhận được lỗi cú pháp Incoorect gần CONSTRAINT. Tôi có mất tích không?

+0

Tôi nghĩ bạn cần 'THÊM TẠO TẠO', như trong ví dụ đầu tiên của bạn. – Andrew

Trả lời

9

Tôi nghĩ vấn đề ở đây là với sự nhầm lẫn giữa Create TableAlter Table lệnh. Nếu chúng ta nhìn vào Create table sau đó chúng ta có thể thêm một giá trị mặc định và hạn chế mặc định cùng lúc như:

<column_definition> ::= 
column_name <data_type> 
    [ FILESTREAM ] 
    [ COLLATE collation_name ] 
    [ SPARSE ] 
    [ NULL | NOT NULL ] 
    [ 
     [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
     | [ IDENTITY [ (seed,increment) ] [ NOT FOR REPLICATION ] 
    ] 
    [ ROWGUIDCOL ] 
    [ <column_constraint> [ ...n ] ] 
    [ <column_index> ] 
ex: 
CREATE TABLE dbo.Employee 
(
    CreateDate datetime NOT NULL 
    CONSTRAINT DF_Constraint DEFAULT (getdate()) 
) 
ON PRIMARY; 

bạn có thể kiểm tra các định nghĩa đầy đủ ở đây: http://msdn.microsoft.com/en-IN/library/ms174979.aspx

nhưng nếu chúng ta nhìn vào định nghĩa Alter Table sau đó với ALTER TABLE ALTER COLUMN bạn không thể thêm CONSTRAINT các tùy chọn có sẵn cho ADD là:

| ADD 
    { 
     <column_definition> 
     | <computed_column_definition> 
     | <table_constraint> 
     | <column_set_definition> 
    } [ ,...n ] 

Kiểm tra ở đây: http://msdn.microsoft.com/en-in/library/ms190273.aspx

Vì vậy, bạn sẽ phải viết hai câu lệnh khác nhau một cho Thay đổi cột như:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL; 

và một cho việc thay đổi bảng và thêm một hạn chế mặc định

ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;

Hy vọng điều này sẽ giúp !!!

+0

ngay tại chỗ. nếu tôi hiểu nó một cách chính xác microsoft cần cập nhật nội dung của họ: http://msdn.microsoft.com/en-us/library/ms187742%28v=sql.110%29.aspx – SZT

+0

no ..if bạn đọc dòng đầu tiên một cách chính xác sau đó nó 'Chỉ định các thuộc tính của một cột được thêm ** vào một bảng bằng cách sử dụng ALTER TABLE. Vì vậy, bạn luôn có thể viết một cái gì đó như: 'ALTER TABLE ** ADD ** COLUMN .. CONSTRAINT .. DEFAULT; ' – Deepshikha

+0

wow bạn r phải một lần nữa :) microsoft cần phải đặt những ngôi sao xung quanh" thêm "haha – SZT

5

Đối với thay đổi một cột hiện tại bạn cần phải:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL; 
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
1

Từ MSDN ALTER TABLE ví dụ:

D. Thêm một hạn chế DEFAULT đến một cột hiện có

Sau đây ví dụ tạo một bảng có hai cột và chèn một giá trị vào cột đầu tiên và cột còn lại là NULL. A DEFAULT ràng buộc sau đó được thêm vào cột thứ hai. Để xác minh rằng mặc định được áp dụng, một giá trị khác được chèn vào cột đầu tiên và bảng được truy vấn.

CREATE TABLE dbo.doc_exz (column_a INT, column_b INT) ; 
GO 
INSERT INTO dbo.doc_exz (column_a)VALUES (7) ; 
GO 
ALTER TABLE dbo.doc_exz 
ADD CONSTRAINT col_b_def 
DEFAULT 50 FOR column_b ; 
GO 
INSERT INTO dbo.doc_exz (column_a) VALUES (10) ; 
GO 
SELECT * FROM dbo.doc_exz ; 
GO 
DROP TABLE dbo.doc_exz ; 
GO 

Vì vậy, trong ngắn hạn, bạn cần ADD CONSTRAINT

ALTER TABLE MyTable 
    ALTER COLUMN CreateDate DATETIME NOT NULL ; 

ALTER TABLE MyTable 
    ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
2

Cần -

ALTER TABLE MyTable 
ALTER COLUMN CreateDate DATETIME NOT NULL; 

ALTER TABLE MyTable 
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
4

Không có cách nào trực tiếp để thay đổi giá trị mặc định của một cột trong SQL server, nhưng kịch bản tham số sau đây sẽ làm việc:

DECLARE @table nvarchar(100) 
DECLARE @column nvarchar(100) 
DECLARE @newDefault nvarchar(100) 
SET @table='TableName' 
SET @column='ColumnName' 
SET @newDefault='0' 

IF EXISTS (select name from sys.default_constraints 
    where parent_object_id = object_id(@table) 
    and parent_column_id = columnproperty(object_id(@table), @column, 'ColumnId')) 
BEGIN 
    DECLARE @constraintName as nvarchar(200) 
    DECLARE @constraintQuery as nvarchar(2000) 

    SELECT @constraintName = name from sys.default_constraints 
     where parent_object_id = object_id(@table) and parent_column_id = columnproperty(object_id(@table),@column, 'ColumnId') 

    SET @constraintQuery = 'ALTER TABLE '[email protected]+' DROP CONSTRAINT '[email protected] +'; ALTER TABLE '+ @table 
     + ' ADD CONSTRAINT ' + @constraintName +' DEFAULT '[email protected]+' FOR '[email protected] 

    EXECUTE sp_executesql @constraintQuery 
END 

Chỉ cần điền vào các thông số và thực thi. Tập lệnh loại bỏ ràng buộc hiện tại và tạo một ràng buộc mới với giá trị mặc định được chỉ định.

+0

Đây là câu trả lời tốt nhất cho tất cả các câu hỏi liên quan đến 'làm cách nào để thay đổi cột giá trị mặc định'? Nó đưa vào tài khoản rằng có một mặc định hiện có, và mặc định đó có thể có một tên hệ thống tạo ra, và nó có thể được kịch bản và không dựa vào quan sát thủ công/thao tác. – mickeyf

Các vấn đề liên quan