2010-01-13 10 views
9

Digamos que tengo esto:¿Es necesario que una enumeración en MySQL NO sea NULL?

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

está poniendo una NOT NULL en el extremo necesario, ya que sólo puede ser Y y N?

EDT: en base a los comentarios, si sé que el software siempre lo establece en 'N' o 'Y' y está codificado, entonces ¿está bien dejarlo apagado o podría ser aún nulo de alguna manera?

Respuesta

-1

No, no es necesario en absoluto, simplemente lo dejará en 'N' como probablemente esté esperando.

Edit: Commenter me hizo salir y probar esto, debe agregar not null a menos que desee que null sea un valor válido. Tener default 'N' lo colocará en N por defecto si deja la columna fuera de su inserción SQL, pero si establece el valor en nulo en la inserción o actualización, insertará una fila con nulo para el valor, ya que es posible que no desee.

+2

lectura http://dev.mysql.com/doc/refman/5.1/en/enum.html ("Si se declara una columna ENUM a permitir NULL, el valor NULL es un valor legal para la columna, y el valor predeterminado es NULL. ") Creo que uno podría insertar con éxito NULL en esta columna. –

11

MySQL permitirá que el valor sea NULL si no especifica NOT NULL en la definición de la columna.

Aquí es una prueba rápida:

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) 

Así MySQL respetar el valor por defecto, sino que también permite nulos. (Curiosamente, se truncará valores no válidos y permitir que las cadenas en blanco, así, pero eso es otro tema)

6

Para establecer un valor por defecto 'N' de la columna con una restricción NOT NULL, hacer esto:

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

Explicación: de acuerdo con la MySQL reference manual:

Si una columna ENUM se declara NOT NULL, su valor por defecto es el primer elemento de la lista de permitidos

0

respuesta de Ian Clelland es muy buena, pero más detalles:

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 
Cuestiones relacionadas