2012-11-06 84 views
50

Cách thêm cột vào bảng SQL Server với giá trị mặc định bằng giá trị của cột hiện tại?Thêm cột vào bảng có giá trị mặc định bằng giá trị của cột hiện tại

Tôi cố gắng này câu lệnh T-SQL:

ALTER TABLE tablename 
ADD newcolumn type NOT NULL DEFAULT (oldcolumn) 

nhưng nó đem lại cho một lỗi:

The name "oldcolumn" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.

+5

Giá trị mặc định có thể là hằng số, không phải cột khác. Điều này cần một kích hoạt, tôi nghĩ. –

+1

ok, làm thế nào tôi có thể làm điều đó, tôi mới đến sql. – doesdos

+1

Điều đó luôn luôn là mặc định hay chỉ là để điền cột cho các hàng hiện có trong khi cột mới đang được thêm vào bảng? –

Trả lời

49

Hãy thử điều này:

ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0) 
Go 
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0 
Go 
+0

Tuyệt vời, sắp hỏi làm thế nào để làm điều đó, làm việc như một say mê cho tôi! –

+3

..có, nhưng điều này sẽ chỉ hoạt động cho các hàng hiện có. Nó sẽ không đặt giá trị [newcolumn] khi các hàng mới được chèn vào. Bạn cần kích hoạt sau khi kích hoạt vv – Milan

+6

Điều này thêm một ràng buộc mặc định có thể không lường trước được trên bảng –

10

tôi không thích họ rất nhiều nhưng đây là cách bạn có thể thực hiện việc này với kích hoạt AFTER INSERT:

CREATE TRIGGER TableX_AfterInsert_TRG 
    ON TableX 
AFTER INSERT 
AS 
    UPDATE TableX AS t 
    SET t.newcolumn = t.oldcolumn 
    FROM Inserted AS i 
    WHERE t.PK = i.PK ;    -- where PK is the PRIMARY KEY of the table 
7

Phương pháp kích hoạt AFTER INSERT liên quan đến phí tổn do tuyên bố thêm UPDATE. Tôi đề nghị sử dụng một INSTEAD OF INSERT kích hoạt, như sau:

CREATE TRIGGER tablename_on_insert ON tablename 
INSTEAD OF INSERT 
AS 
INSERT INTO tablename (oldcolumn, newcolumn) 
SELECT oldcolumn, ISNULL(newcolumn, oldcolumn) 
FROM inserted 

này không hoạt động mặc dù nếu oldcolumn là một cột tự động nhận dạng.

-3

Tôi nghĩ rằng nó sẽ hoạt động nếu bạn sử dụng Set Identity_Insert <TableName> OFF và sau khi tuyên bố chèn mà bạn đã viết chỉ sử dụng Set Identity_Insert <TableName> ON.

1

Để mở rộng Kapil câu trả lời của, và tránh được những hạn chế mặc định không mong muốn, hãy thử này:

ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999 
Go 
Update tablename SET newcolumn = oldcolumn 
Go 
ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN 
Go 

Thay -9999 bởi 'noData' nếu kiểu của bạn là varchar, nvarchar, datetime, ... hoặc bằng cách bất kỳ dữ liệu tương thích nào cho các loại khác: giá trị cụ thể không quan trọng, nó sẽ bị xóa bởi lệnh thứ 2.

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