2010-01-13 3 views
9

Disons que j'ai ceci:un ENUM dans MySQL doivent NOT NULL?

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

met un NOT NULL à la fin nécessaire car il ne peut être que Y et N? EDT: basé sur les commentaires, si je sais que le logiciel le définit toujours sur 'N' ou 'Y' et qu'il est codé en dur, alors est-il correct de le laisser éteint ou pourrait-il encore devenir potentiellement nul de quelle manière?

Répondre

-1

Non, pas du tout nécessaire, il vous reste plus qu'à défaut à « N » que vous êtes probablement attendre. Editer: Commenter m'a fait partir et tester cela, vous devriez ajouter not null sauf si vous voulez que la valeur de null soit valide. Ayant default 'N' sera par défaut à N si vous laissez la colonne de votre insert SQL, mais si vous définissez la valeur null dans l'insert ou le mettre à jour insèrera une ligne avec nulle pour la valeur, vous pourriez ne pas vouloir.

+2

Lecture http://dev.mysql.com/doc/refman/5.1/en/enum.html ("Si une colonne de type ENUM est déclarée permettre NULL, la valeur NULL est une valeur juridique de la colonne, et la valeur par défaut est NULL. ») Je crois que l'on pourrait insérer avec succès NULL dans cette colonne. –

11

MySQL permettra la valeur à NULL si vous ne spécifiez pas NOT NULL dans la définition de la colonne.

Voici un test rapide:

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) 

donc MySQL ne respecte la valeur par défaut, mais permet également NULLs. (Fait intéressant, il tronquer les valeurs non valides et permettre à des chaînes vides aussi bien, mais c'est une autre question)

6

Pour définir une valeur par défaut « N » pour la colonne avec une contrainte NOT NULL, faites ceci:

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

Explication: Selon le MySQL reference manual:

Si une colonne est déclarée ENUM NOT NULL, la valeur par défaut est le premier élément de la liste des permis

0

Réponse de Ian Clelland est très bon, mais plus de détails:

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