chèn một cột KHÔNG ĐẦY ĐỦ vào bảng hiện có


121

Tôi đã thử:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Nhưng nó đưa ra thông báo lỗi này:

ALTER TABLE chỉ cho phép thêm các cột có thể chứa rỗng hoặc có định nghĩa DEFAULT được chỉ định

Câu trả lời:


222

Là một tùy chọn, ban đầu bạn có thể tạo cột Null-could, sau đó cập nhật cột bảng của bạn với các giá trị không phải null hợp lệ và cuối cùng là cột ALTER để đặt ràng buộc NOT NULL:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

Một tùy chọn khác là chỉ định giá trị mặc định chính xác cho cột của bạn:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

CẬP NHẬT: Xin lưu ý rằng câu trả lời ở trên chứa GOđiều bắt buộc khi bạn chạy mã này trên máy chủ Microsoft SQL. Nếu bạn muốn thực hiện thao tác tương tự trên Oracle hoặc MySQL, bạn cần sử dụng dấu chấm phẩy ;như sau:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

1
Cá nhân tôi thích cách đầu tiên ở đây hơn nếu bạn có các giá trị bạn có thể đặt vào trường theo cách thủ công. Bằng cách đó, bạn không phải lo lắng về việc tạo và xóa một ràng buộc mặc định mà bạn không cần.
Mark W Dickson

1
@acarlon - Tôi nghĩ điều đó đang đạt được. updateTuyên bố nguy hiểm mà bạn đề cập sẽ gây bất lợi trong bất kỳ truy vấn nào. Nó phải đủ đơn giản để xem liệu bạn có thêm một cột trong updatecâu lệnh ở đây hay không. Bạn thường chỉ thêm một hoặc hai cột cùng một lúc. updateTrong ví dụ này, nếu bạn tình cờ thêm một cột bổ sung vào bảng sao kê của mình , thì có lẽ bạn không nên phụ trách dữ liệu ngay từ đầu.
Mark W Dickson

1
ANDROID Các nhà phát triển sử dụng SQLite hãy lưu ý rằng điều ALTER COLUMNnày KHÔNG được hỗ trợ trong SQLite.
Sdghasemi

2
Tôi chưa từng thấy GOtrước đây và nó dường như không phải là một phần của đặc tả SQL , do đó, nó có thể sẽ dẫn đến lỗi cho các tập lệnh không được thực thi bởi một trong những công cụ hỗ trợ nó. Chỉ sử dụng dấu chấm phẩy? Tôi không khuyên bạn nên phổ biến các tiêu chuẩn của Microsoft vì họ hiếm khi quan tâm đến bất kỳ tiêu chuẩn nào đã được thiết lập và hợp lý, mà tự phát minh ra tiêu chuẩn của họ chỉ để phát minh ra riêng họ. Ngoài ra, câu trả lời hữu ích.
Neonit

2
@Neon cảm ơn vì nhận xét, nhưng câu hỏi ban đầu là về máy chủ MS SQL, đó là lý do tại sao GO ở đó. Nhưng tôi sẽ thêm một ghi chú về nó vào câu trả lời của tôi.
Pavel Morshenyuk 21/09/16

13

Nếu bạn không cho phép cột Null, bạn cần cung cấp giá trị mặc định để điền các hàng hiện có. ví dụ

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

Trên phiên bản Enterprise, đây là một thay đổi chỉ về siêu dữ liệu kể từ năm 2012


2
Bạn không cần phải làm vậy, nhưng đó là một lựa chọn.
Matt

6

Thông báo lỗi khá mô tả, hãy thử:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

và ý nghĩa của "dấu trừ" trong phần mặc định là gì?
Mladen B.

3

Các triển khai SQL khác có các hạn chế tương tự. Lý do là việc thêm một cột yêu cầu thêm các giá trị cho cột đó (về mặt logic, ngay cả khi không phải về mặt vật lý), giá trị mặc định là NULL. Nếu bạn không cho phép NULLvà không có default, giá trị sẽ là bao nhiêu?

Vì SQL Server hỗ trợ ADD CONSTRAINT, tôi khuyên bạn nên tiếp cận cách tạo cột nullable của Pavel, sau đó thêm một NOT NULLràng buộc sau khi bạn đã điền nó bằng các NULLgiá trị không phải .


MySQL hỗ trợ thêm cột không rỗng vào bảng hiện có với dữ liệu, trong đó giá trị trống "hợp lý" cho kiểu dữ liệu được cung cấp vào các hàng hiện có (ví dụ: 0,0 cho float, 0 cho số nguyên, chuỗi trống cho chuỗi, v.v.).
Michael Tsang

2

Điều này làm việc cho tôi, cũng có thể được "mượn" từ chế độ xem thiết kế, thực hiện thay đổi -> nhấp chuột phải -> tạo tập lệnh thay đổi.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT

1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;

0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

1
Câu trả lời này bổ sung gì cho chủ đề này?
barbsan
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.