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


90

Làm cách nào để 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 có?

Tôi đã thử câu lệnh T-SQL này:

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

nhưng nó báo lỗi:

Tên "cột cũ" không được phép trong ngữ cảnh này. Biểu thức hợp lệ là hằng số, biểu thức hằng và biến (trong một số ngữ cảnh). Tên cột không được phép.


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

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

1
Điều đó sẽ luôn là mặc định, hay đây chỉ để đ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?
Damien_The_Un Believer

1
@Damien_The_Un Believer chỉ để điền cột cho các hàng hiện có.
doesdos

2
UPDATETôi e rằng bạn phải làm điều đó riêng biệt .
Damien_The_Un Believer

Câu trả lời:


73

Thử đi:

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

5
.. 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 CHÈN, v.v.
Milan

14
Điều này thêm một hạn chế mặc định có thể ngoài ý muốn trên bàn
Romain Vergnory

1
@RomainVergnory Tôi đồng ý, tốt hơn là lúc đầu nên chuyển sang KHÔNG hạn chế KHÔNG ĐẦY ĐỦ, sau đó điền các giá trị vào cột hiện có và sau đó thêm lại KHÔNG
ĐỦ

15

Tôi không thích chúng lắm nhưng đây là cách bạn có thể làm điều này với một trình AFTER INSERTkích hoạt:

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   

13

Phương AFTER INSERTpháp kích hoạt liên quan đến chi phí do UPDATEcâu lệnh bổ sung . Tôi khuyên bạn nên sử dụng một trình INSTEAD OF INSERTkí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

Điều này không hoạt động mặc dù nếu oldcolumnlà cột nhận dạng tự động.


2
INSTEAD OFtrigger cũng không hoạt động khi sử dụng các bảng tạm thời:SYSTEM_VERSIONING = ON
CalvinDale

3

Để mở rộng câu trả lời của Kapil và tránh ràng buộc mặc định không mong muốn, hãy thử cách 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 thế -9999 bằng 'noData' nếu loại của bạn là varchar, nvarchar, datetime, ... hoặc bằng 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.


1

Bạn có thể sử dụng cột được tính toán để chèn cột mới vào bảng dựa trên giá trị cột hiện có

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;

HOẶC, nếu bạn muốn thực hiện một số thay đổi đối với giá trị dựa trên giá trị cột hiện có, hãy sử dụng

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;

0

Đối với trường hợp của tôi, tôi muốn thêm một cột duy nhất không null mới có tên là CODE nhưng tôi không biết về giá trị tại thời điểm tạo. Tôi đặt giá trị mặc định cho nó bằng cách lấy giá trị mặc định từ NewID () rồi cập nhật sau.

ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5))

ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])

-3

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

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.