Tengo una tabla que tiene varias columnas de ID para otras tablas.
Quiero una clave foránea para forzar la integridad solo si pongo datos allí. Si hago una actualización más tarde para llenar esa columna, entonces también debería verificar la restricción.
(Esto es probable que 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ígeme si me equivoco.
sql
mysql
database
foreign-keys
juerga
fuente
fuente
Respuestas:
Sí, puede aplicar la restricción solo cuando el valor no es NULL. Esto se puede probar fácilmente con el siguiente ejemplo:
La primera inserción pasará porque insertamos un NULL en el
parent_id
. La segunda inserción falla debido a la restricción de clave externa, ya que intentamos insertar un valor que no existe en laparent
tabla.fuente
parent_id INT NULL
parte es (literalmente) igual aparent_id int default null
int
lugar deInteger
en los miembros de su clase, el valor predeterminado nunca será nulo, pero será 0 y fallará la restricción.Descubrí que al insertar, los valores de columna nulos 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).
fuente
INSERT INTO {table} {list_of_columns}
? Porque eso es cierto para mí; omitir la mención de la columna causa un error, pero incluir y establecer explícitamente en NULL corrige el error. Si estoy en lo cierto, creo que el comentario de @ Gary no se aplica (porque no querías decir una cadena vacía), pero @Kevin Coulombe podría ser útil ...Sí, eso funcionará como lo espera. 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 se refiere a la ausencia de valor, por lo que cuando establece una columna en NULL, no tendría sentido intentar imponer restricciones sobre eso.
fuente
Lo anterior funciona pero esto no. Tenga en cuenta la CASCADA ELIMINAR
fuente
Sí, el valor puede ser NULL, pero debe ser explícito. He experimentado esta misma situación antes, y es fácil olvidar POR QUÉ sucede esto, por lo que lleva un poco de tiempo recordar lo que hay que hacer.
Si los datos enviados son emitidos o interpretados como una cadena vacía, fallará. Sin embargo, al establecer explícitamente el valor en NULL al INSERTAR o ACTUALIZAR, está listo para comenzar.
Pero esta es la diversión de la programación, ¿no? ¡Creando nuestros propios problemas y luego arreglándolos! ¡Salud!
fuente
Otra forma de evitar esto sería insertar un elemento DEFAULT en la otra tabla. Por ejemplo, cualquier referencia a uuid = 00000000-0000-0000-0000-000000000000 en la otra tabla indicaría que no hay acción. También debe establecer todos los valores para que esa identificación sea "neutral", por ejemplo, 0, cadena vacía, nula para no afectar la lógica de su código.
fuente
También me atasqué en este tema. Pero lo resolví simplemente definiendo la clave externa como
unsigned integer
. Encuentra el siguiente ejemplo:fuente