2014-04-04 13 views
17

Tôi thêm một cột vào một bảng:MySQL thêm một cột NOT NULL

ALTER TABLE t ADD c varchar(10) NOT NULL; 

Cột được thêm vào, và mỗi bản ghi có chuỗi rỗng.

Điều này dự kiến ​​sẽ hoạt động theo cách này trong mọi điều kiện (chế độ nghiêm ngặt, v.v.) trong MySQL 5.5+?

+7

có. Nếu không, sẽ không thể thêm cột mới vào bảng. Các cột mới sẽ đặt giá trị của chúng là giá trị mặc định cho cột đó hoặc giá trị "mặc định tự động" thích hợp cho loại của chúng. Đối với một 'varchar không null', đó là một chuỗi rỗng. –

+0

@MarcB, đó là những gì tôi đã tìm. Cảm ơn bạn đã xác minh. –

+2

@MarcB, như user2864740 cho biết, nó sẽ là hoàn toàn có thể. Bạn chỉ cần chỉ định một mặc định, mà các DBMS khác yêu cầu ở đây. –

Trả lời

22

Trong MySQL, mỗi loại cột có "implicit default" value.

Đối với các loại chuỗi [giá trị ngầm định] mặc định là chuỗi trống.

Nếu một cột NOT NULL là added to a table, và không có DEFAULT rõ ràng được chỉ định, giá trị mặc định ngầm được sử dụng để cư dữ liệu cột mới . Các quy tắc tương tự áp dụng khi giá trị DEFAULT được chỉ định.

Như vậy, DDL gốc tạo ra kết quả tương tự như:

-- After this, data will be the same, but schema has an EXPLICIT DEFAULT 
ALTER TABLE t ADD c varchar(10) NOT NULL DEFAULT '' 
-- Now we're back to the IMPLICIT DEFAULT (MySQL stores NULL internally) 
ALTER TABLE t ALTER c DROP DEFAULT 

Các thiết lập chế độ "nghiêm ngặt" ảnh hưởng đến báo cáo DML dựa trên các giá trị mặc định, nhưng không ảnh hưởng đến việc sử dụng mặc định ngầm khi cột được thêm .

Đối với nhập dữ liệu vào một cột NOT NULL mà không có khoản DEFAULT rõ ràng, nếu một INSERT hoặc REPLACE tuyên bố bao gồm không có giá trị cho cột [và nếu] nghiêm ngặt chế độ SQL được kích hoạt, một lỗi xảy ra ..

Đây là an sqlfiddle "proof" chế độ nghiêm ngặt không áp dụng cho câu lệnh ALTER TABLE .. ADD.


Đây là tính năng của MySQL. Các công cụ khác, như SQL Server, yêu cầu một ràng buộc DEFAULT (hoặc cột NULL) rõ ràng cho những thay đổi lược đồ như vậy.

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