Định nghĩa cột SQL: giá trị mặc định và không thừa null?


87

Tôi đã nhìn thấy nhiều lần cú pháp sau để xác định một cột trong câu lệnh tạo / thay đổi DDL:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

Câu hỏi đặt ra là: vì một giá trị mặc định được chỉ định, có cần thiết phải chỉ định rằng cột không được chấp nhận NULL không? Nói cách khác, DEFAULT có hiển thị NOT NULL không?

Câu trả lời:


130

DEFAULTlà giá trị sẽ được chèn trong trường hợp không có giá trị rõ ràng trong câu lệnh chèn / cập nhật. Giả sử, DDL của bạn không có NOT NULLràng buộc:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT 'MyDefault'

Sau đó, bạn có thể đưa ra những tuyên bố này

-- 1. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

Ngoài ra, bạn cũng có thể sử dụng DEFAULTtrong các UPDATEcâu lệnh, theo tiêu chuẩn SQL-1992 :

-- 5. This will update 'MyDefault' into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

Lưu ý, không phải tất cả cơ sở dữ liệu đều hỗ trợ tất cả các cú pháp chuẩn SQL này. Thêm NOT NULLràng buộc sẽ gây ra lỗi với các câu lệnh 4, 6, trong khi đó 1-3, 5vẫn là những câu lệnh hợp lệ. Vì vậy, để trả lời câu hỏi của bạn: Không, chúng không thừa.


Tôi đã truy cập liên kết của bạn (đến bài đăng trên blog của bạn) với mong muốn xem lời giải thích (có thể với một số con số) về tác động to lớn đối với hiệu suất truy vấn, nhưng chỉ thấy nó ngắn gọn lại rằng nó có tác động. Không xúc phạm, nhưng liên kết là một chút sai lầm.
Seth Flowers

@SethFlowers: Cảm ơn vì con trỏ, Seth. Bài báo được liên kết đã được chỉnh sửa trong thời gian chờ đợi. Tôi sẽ xem liệu tôi có thể liên kết thứ gì khác thay thế hay xóa liên kết. Như bây giờ, bạn hoàn toàn đúng, nó không thêm bất kỳ giá trị nào cho câu trả lời ở đây.
Lukas Eder

Cảm ơn - tôi hy vọng tôi không nghe thô lỗ. Tôi vừa nhìn thấy liên kết và giống như "vâng, đó chắc chắn là thứ tôi muốn đọc" - sau đó hơi thất vọng :).
Seth Flowers

@SethFlowers: Đừng lo lắng. Tôi hoàn toàn đồng ý. Để giải cứu tôi: kỹ năng viết blog của tôi cải thiện đáng kể trong những năm qua :)
Lukas Eder

19

Ngay cả với giá trị mặc định, bạn luôn có thể ghi đè dữ liệu cột với null.

Các NOT NULLhạn chế sẽ không cho phép bạn cập nhật hàng đó sau khi nó được tạo ra với nullgiá trị


Tôi nghĩ điều này nên được diễn đạt lại: "Hạn chế NOT NULL sẽ không cho phép bạn cập nhật hàng đó sau khi nó được tạo với giá trị null" Tất nhiên, các hàng có cột NOT NULL có thể được cập nhật, chúng chỉ không thể được cập nhật với null dưới dạng giá trị cho cột đó. Hơn nữa: Tôi giả sử rằng tạo một hàng có nghĩa là chèn một hàng. Câu lệnh INSERT không được có giá trị rỗng cho các cột được chỉ định bằng NOT NULL.
makrom

4

Giáo viên SQL của tôi nói rằng nếu bạn chỉ định cả DEFAULTgiá trị và NOT NULLhoặc NULL, DEFAULTluôn phải được biểu thị trước NOT NULLhoặc NULL.

Như thế này:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL


5
Xin chào, và cảm ơn vì đã tham gia. Tuy nhiên, điều này không giải quyết được câu hỏi và cả hai thử thách đều hoàn toàn hiệu quả. Tôi thấy việc đặt mặc định ở cuối dễ dàng hơn khi tôi viết các bảng theo cách thủ công vì khi đó các giá trị NULL và NOT NULL sắp xếp tốt hơn.
emragins

Được rồi, tôi đoán bạn cũng đúng. Tôi không hiểu tại sao khóa học của tôi lại nói rõ ràng những gì tôi đã viết trên câu trả lời của mình. Tôi biết rằng câu trả lời của tôi không thực sự giải quyết được câu hỏi, nhưng tôi thấy rằng một nhận xét sẽ không dễ đọc.
Tanguy Labrador Ruiz

3
Có sự khác biệt giữa phương pháp hay nhất (chủ quan) và các quy tắc. Không phải là một ý tưởng tồi khi có một phong cách nhất quán, nhưng trong trường hợp cụ thể này, cá nhân tôi muốn KHÔNG ĐẦY ĐỦ trước khi DEFAULT. Bất kể, bạn cũng có thể viết bình luận thay vì câu trả lời, điều này sẽ phù hợp hơn.
makrom

Điều đó có lẽ không trả lời câu hỏi. Nhưng đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn.
Sasuke Uchiha

2

Tôi sẽ nói là không.

Nếu cột chấp nhận giá trị null, thì không có gì ngăn bạn chèn giá trị null vào trường. Theo như tôi biết, giá trị mặc định chỉ áp dụng khi tạo một hàng mới.

Với không đặt null, thì bạn không thể chèn giá trị null vào trường vì nó sẽ gây ra lỗi.

Hãy coi nó như một cơ chế an toàn thất bại để ngăn chặn null.


2
Bạn đã nói "tạo ra một quy tắc mới". Bạn có định nói 'tạo một hàng mới' không?
bielawski

Tôi nghĩ rằng đó là một câu trả lời thiết thực hơn của câu hỏi này.
Noman_ibrahim

@bielawski Và gần 8 năm sau, tôi phải sửa lỗi chính tả đó :)
Dark Hippo

Đây phải là câu trả lời được chấp nhận. OP yêu cầu một câu hỏi đơn giản và câu trả lời chỉ đơn giản là "không". Tuy nhiên, giải thích và ví dụ là cần thiết cho tài liệu.
Nicolas Hevia

0

Nói cách khác, DEFAULT có hiển thị NOT NULL không?

Không, nó không phải là thừa. Để mở rộng câu trả lời được chấp nhận. Đối với cột colcó giá trị nullable, chúng tôi có thể chèn NULL ngay cả khi DEFAULT được xác định:

CREATE TABLE t(id INT PRIMARY KEY, col INT DEFAULT 10);

-- we just inserted NULL into column with DEFAULT
INSERT INTO t(id, col) VALUES(1, NULL);

+-----+------+
| ID  | COL  |
+-----+------+
|   1 | null |
+-----+------+

Oracle đã giới thiệu cú pháp bổ sung cho kịch bản như vậy để ghi đè NULL rõ ràng với mặc định DEFAULT ON NULL:

CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10);
-- same as
--CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10 NOT NULL); 

INSERT INTO t2(id, col) VALUES(1, NULL);

+-----+-----+
| ID  | COL |
+-----+-----+
|  1  |  10 |
+-----+-----+

Ở đây chúng tôi đã cố gắng chèn NULL nhưng thay vào đó lấy mặc định.

db <> bản trình diễn fiddle

TRÊN KHÔNG

Nếu bạn chỉ định mệnh đề ON NULL, thì Cơ sở dữ liệu Oracle sẽ gán giá trị cột DEFAULT khi một câu lệnh INSERT tiếp theo cố gắng gán một giá trị đánh giá là NULL.

Khi bạn chỉ định ON NULL, trạng thái ràng buộc NOT NULL và NOT DEFERRABLE được chỉ định ngầm.

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.