2010-01-13 19 views
9

phép nói rằng tôi có điều này:Liệu một enum trong MySQL cần phải được NOT NULL?

ALTER TABLE asdf ADD field ENUM('Y', 'N') DEFAULT 'N'; 

là đặt một NOT NULL ở đầu cần thiết vì nó chỉ có thể là Y và N?

EDT: dựa trên các nhận xét, nếu tôi biết phần mềm luôn đặt thành 'N' hoặc 'Y' và được mã hóa cứng thì có thể bỏ qua hoặc có khả năng nó không hoạt động như thế nào.

Trả lời

-1

Không, không cần thiết chút nào, nó sẽ chỉ mặc định là 'N' như bạn có thể mong đợi.

Chỉnh sửa: Người nhận xét khiến tôi tắt và kiểm tra điều này, bạn nên thêm not null trừ khi bạn muốn null là giá trị hợp lệ. Có default 'N' sẽ mặc định nó thành N nếu bạn rời khỏi cột trong SQL chèn của bạn, nhưng nếu bạn đặt giá trị là null trong chèn hoặc cập nhật, nó sẽ chèn một hàng với giá trị rỗng, vì bạn có thể không muốn.

+2

Reading http://dev.mysql.com/doc/refman/5.1/en/enum.html ("Nếu một cột ENUM được khai báo để cho phép NULL, giá trị NULL là một giá trị pháp lý cho cột, và giá trị mặc định là NULL. ") Tôi tin rằng người ta có thể chèn thành công NULL trong cột này. –

11

MySQL sẽ cho phép giá trị là NULL nếu bạn không chỉ định NOT NULL trong định nghĩa cột.

Dưới đây là một thử nghiệm nhanh:

mysql> create table test (id serial, field ENUM('Y','N') DEFAULT 'N'); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO test (field) VALUES ('Y'); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO test (field) VALUES ('N'); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO test() VALUES(); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO test (field) VALUES (NULL); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO test (field) VALUES ('Invalid'); 
Query OK, 1 row affected, 1 warning (0.01 sec) 

mysql> show warnings; 
+---------+------+--------------------------------------------+ 
| Level | Code | Message         | 
+---------+------+--------------------------------------------+ 
| Warning | 1265 | Data truncated for column 'field' at row 1 | 
+---------+------+--------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select * from test; 
+----+-------+ 
| id | field | 
+----+-------+ 
| 1 | Y  | 
| 2 | N  | 
| 3 | N  | 
| 4 | NULL | 
| 5 |  | 
+----+-------+ 
5 rows in set (0.00 sec) 

Vì vậy, MySQL không tôn trọng các giá trị mặc định, nhưng cũng cho phép null. (Thú vị, nó sẽ cắt ngắn giá trị không hợp lệ và cho phép chuỗi trống là tốt, nhưng đó là một vấn đề khác nhau)

6

Để đặt một giá trị mặc định 'N' cho cột với một hạn chế NOT NULL, làm điều này:

ALTER TABLE asdf ADD field ENUM('N', 'Y') NOT NULL; 

Giải thích: Theo MySQL reference manual:

Nếu một cột ENUM được khai báo NOT NULL, giá trị mặc định của nó là yếu tố đầu tiên của danh sách được phép

0

trả lời từ Ian Clelland là rất tốt nhưng chi tiết hơn:

mysql> CREATE TABLE en1(en enum('A','B') DEFAULT 'A',sets set('A','B') DEFAULT ' 
    B'); 
    Query OK, 0 rows affected (0.03 sec) 

    mysql> INSERT INTO en1 VALUES(); 
    Query OK, 1 row affected (0.00 sec) 

    mysql> INSERT INTO en1 VALUES(NULL,NULL); 
    Query OK, 1 row affected (0.00 sec) 

    mysql> SELECT * FROM en1; 
    +------+------+ 
    | en | sets | 
    +------+------+ 
    | A | B | 
    | NULL | NULL | 
    +------+------+ 
    2 rows in set (0.00 sec) 

    mysql> CREATE TABLE en2(en enum('A','B') DEFAULT 'A' NOT NULL,sets set('A','B') 
    DEFAULT 'B' NOT NULL); 
    Query OK, 0 rows affected (0.05 sec) 

    mysql> INSERT INTO en2 VALUES(NULL,NULL); 
    ERROR 1048 (23000): Column 'en' cannot be null 
Các vấn đề liên quan