única vacia unica una ser pueden puede nulas nula llave las foránea foranea clave sql mysql database foreign-keys

sql - vacia - una llave foranea puede ser unica



¿Pueden las columnas de la tabla con una clave foránea ser nulas? (3)

Por ejemplo, tengo una tabla que tiene varias columnas de ID para otras tablas. Quiero una clave externa para forzar la integridad solo si coloco datos allí. Si realizo una actualización más tarde para rellenar esa columna, entonces seguirá revisando la restricción (es probable que esto dependa del servidor de la base de datos, estoy usando el tipo de tabla MySQL e InnoDB). Creo que esta es una expectativa razonable, pero corríjanme si me equivoco.


Encontré que al insertar, los valores de la columna nula tenían que declararse específicamente como NULL, de lo contrario obtendría un error de violación de restricción (en lugar de una cadena vacía).


Sí, eso funcionará como esperabas. Desafortunadamente, parece que tengo problemas para encontrar una declaración explícita de esto en el manual de MySQL .

Las claves foráneas significan que el valor debe existir en la otra tabla. NULL refiere a la ausencia de valor, por lo que cuando establece una columna en NULL, no tendría sentido tratar de imponer restricciones sobre eso.


Sí, puede aplicar la restricción solo cuando el valor no sea NULO. Esto se puede probar fácilmente con el siguiente ejemplo:

CREATE DATABASE t; USE t; CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child (id INT NULL, parent_id INT NULL, FOREIGN KEY (parent_id) REFERENCES parent(id) ) ENGINE=INNODB; INSERT INTO child (id, parent_id) VALUES (1, NULL); -- Query OK, 1 row affected (0.01 sec) INSERT INTO child (id, parent_id) VALUES (2, 1); -- ERROR 1452 (23000): Cannot add or update a child row: a foreign key -- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY -- (`parent_id`) REFERENCES `parent` (`id`))

El primer inserto pasará porque insertamos un NULL en el parent_id . La segunda inserción falla debido a la restricción de clave externa, ya que hemos intentado insertar un valor que no existe en la tabla parent .