2010-10-28 18 views
8

Tengo una columna entera a la que me gustaría añadir una restricción de clave externa. El único problema es que si esa columna no tiene/necesita un valor, MySQL pone por defecto un valor '0'. Obviamente, esto rompe la restricción de clave externa ya que no hay ningún registro en la tabla principal con un PK de 0.Restricción de clave externa MySQL - Columna entera

¿Cómo puedo solucionar este problema?

Respuesta

7

Es posible que desee establecer su clave externa para aceptar NULL valores, y utilizar un valor NULL en lugar de 0.

Conceptualmente, NULL significa a falta el valor desconocido. Si su fila "no tiene/no necesita el valor", creo que un NULL encaja perfectamente.

Y sí, un valor de NULL no rompería su restricción de clave externa.

Vamos a construir un ejemplo básico:

CREATE TABLE parents (
    id  int PRIMARY KEY, 
    value int 
) ENGINE = INNODB; 

CREATE TABLE children (
    id   int PRIMARY KEY, 
    parent_id int, 
    FOREIGN KEY (parent_id) REFERENCES parent (id) 
) ENGINE = INNODB; 

continuación:

INSERT INTO parents VALUES (1, 100); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (1, 1); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (2, 0); 
ERROR 1452 (23000): A foreign key constraint fails 

INSERT INTO children VALUES (2, NULL); 
Query OK, 1 row affected (0.00 sec) 

SELECT * FROM children; 
+----+-----------+ 
| id | parent_id | 
+----+-----------+ 
| 1 |   1 | 
| 2 |  NULL | 
+----+-----------+ 
2 rows in set (0.01 sec) 
1

permiten Quizás nulos en la columna de clave externa y establecer el valor predeterminado en nulo.

2

Sin embargo, piense largo y duro sobre permitir que la columna FK sea nula. Nulo significa que puede tener un registro secundario sin un padre. ¿Es esto realmente un caso de negocios válido? ¿Puedes dar un ejemplo donde esto es válido?

Además, un FK nulo (o cualquier columna nula) significa que ahora está haciendo suposiciones sobre lo que significa el nulo. ¿Cómo se puede saber si el campo realmente no debe tener un valor, frente a alguien que se olvida de ponerle un valor? Podría implementar la lógica No nulo en la aplicación y eludir el problema de esa manera, aunque esto todavía implica riesgos. Mejores mentes que las mías han dicho que permitir valores nulos hace que el diseño de la base de datos sea menos estable. YMMV. Tal vez considere un valor predeterminado como -1 que aún fuerza un FK no nulo y busca un registro ficticio.

Cuestiones relacionadas