El paso a paso o código que hallarás en este post es la resolución más fácil y efectiva que encontramos a tu duda o problema.
Solución:
Si te gusta el Parent
y Child
términos y cree que son fáciles de recordar, puede que le guste la traducción de ON DELETE CASCADE
para Leave No Orphans!
Lo que significa que cuando un Parent
fila se elimina (mata), ninguna fila huérfana debe permanecer viva en el Child
mesa. También se eliminan (eliminan) todos los elementos secundarios de la fila principal. Si alguno de estos hijos tiene nietos (en otra mesa a través de otro extranjero key) y ahí está ON DELETE CASCADE
definidos, estos también deben ser eliminados (y todos los descendientes, siempre que haya un efecto de cascada definido).
los FOREIGN KEY
la propia restricción también podría describirse como Allow No Orphans!
(en primer lugar). No Child
debería permitirse (escrito) en la tabla secundaria si no tiene un Parent
(una fila en la tabla principal).
Por consistencia, el ON DELETE RESTRICT
se puede traducir al (menos agresivo) You Can't Kill Parents!
Solo las filas sin hijos se pueden matar (eliminar).
Por ejemplo, si tengo dos tablas, principal y secundaria, donde los registros secundarios son propiedad de los registros principales, ¿qué tabla necesita ON DELETE CASCADE?
ON DELETE CASCADE es una cláusula opcional en un extranjero key declaración. Así que va con El extranjero key declaración. (Es decir, en la tabla “hijo”).
… podría significar eliminar el registro principal cuando se elimina el registro secundario, o podría significar eliminar el registro secundario cuando se elimina el registro principal. Entonces, ¿cuál es?
Una forma de interpretar un extranjero key declaración es, “Todos los valores válidos para esta columna provienen de ‘esa_columna’ en ‘esa_tabla'”. Cuando elimina una fila en la tabla “secundaria”, a nadie le importa. No afecta la integridad de los datos.
Cuando elimina una fila de la tabla “principal”, de “esa_tabla”, elimina un valor válido de los valores posibles para la tabla “secundaria”. Para mantener la integridad de los datos, debe hacer alguna cosa a la mesa del “niño”. Las eliminaciones en cascada es una cosa que puede hacer.
Capítulo y verso, de los documentos de PostgreSQL.
La restricción y la eliminación en cascada son las dos opciones más comunes. RESTRICT evita la eliminación de una fila referenciada. SIN ACCIÓN significa que si aún existen filas de referencia cuando se verifica la restricción, se genera un error; este es el comportamiento predeterminado si no especifica nada. (La diferencia esencial entre estas dos opciones es que NO ACTION permite que el cheque se difiera hasta más adelante en la transacción, mientras que RESTRICT no.) CASCADE especifica que cuando se elimina una fila referenciada, las filas que hacen referencia a ella deben eliminarse automáticamente. así como. Hay otras dos opciones: SET NULL y SET DEFAULT. Esto hace que las columnas de referencia en las filas de referencia se establezcan en nulos o sus valores predeterminados, respectivamente, cuando se elimina la fila de referencia. Tenga en cuenta que estos no le eximen de observar ninguna restricción. Por ejemplo, si una acción especifica SET DEFAULT pero el valor predeterminado no satisfaría el valor externo key restricción, la operación fallará.
SQL: Especificación 2011
Hay cinco opciones para ON DELETE
y ON UPDATE
que se puede aplicar a la FOREIGN KEY
. Estos se llaman
, directamente de la especificación SQL: 2011
ON DELETE CASCADE
: si se elimina una fila de la tabla de referencia, se eliminan todas las filas coincidentes de la tabla de referencia.ON DELETE SET NULL
: si se elimina una fila de la tabla de referencia, todas las columnas de referencia en todas las filas coincidentes de la tabla de referencia se establecerán en null.ON DELETE SET DEFAULT
: si se elimina una fila de la tabla de referencia, todas las columnas de referencia en todas las filas coincidentes de la tabla de referencia se establecerán en el valor predeterminado de la columna.ON DELETE RESTRICT
: está prohibido eliminar una fila de la tabla de referencia si esa fila tiene filas coincidentes en la tabla de referencia.ON DELETE NO ACTION
(el valor por defecto): no hay acción de eliminación referencial; la restricción de referencia solo especifica una verificación de restricción.
El extranjero key establece la relación de dependencia. los
determina qué sucede cuando la relación se disuelve.
Ejemplo / Metáfora / Explicación
Para este ejemplo, aceptaremos el modelo común de sociedad y economía: donde cada business
es una empresa que mantiene una relación con el bourgeoisie
a través de un fatcat_owner
.
CREATE TABLE bourgeoisie(
fatcat_owner varchar(100) PRIMARY KEY
);
INSERT INTO bourgeoisie(fatcat_owner) VALUES
( 'Koch Brothers' );
CREATE TABLE business (
name varchar(100),
fatcat_owner varchar(100) REFERENCES bourgeoisie
);
INSERT INTO business(name, fatcat_owner)
VALUES ('Georgia-Pacific', 'Koch Brothers');
Me caigo business
son directamente afectados por bourgeoisie
a través de su fatcat_owner
Entonces, ¿qué haces después de la revolución obrera cuando purgas el fatcat_owner
sy tener una sociedad sin clases?
-- Viva la revolución
BEGIN;
DELETE FROM bourgeoisie;
END;
Tienes algunas opciones aquí,
-
Detén la revolución. En el lenguaje SQL,
RESTRICT
. Algunas personas creen que este es el mal menor, pero generalmente se equivocan. -
Deja que continúe. Si es así, cuando ocurre la revolución SQL le da cuatro opciones,
-
SET NULL
— dejalo en blanco. Quién sabe, tal vez se restaure el capitalismobourgeoisie
surge y los oligarcas llenan el rollo de lafatcat_owners
. Nota importante, la columna debe estarNULLABLE
(noNOT NULL
) o esto nunca puede suceder. -
SET DEFAULT
– tal vez tuviste unDEFAULT
que manejó esto? A
DEFAULT
puede llamar a una función. Quizás su esquema ya esté listo para la revolución. -
CASCADE
– no hay control de daños. Si elbourgeoisie
va, también lo hace elbusiness
. Si un negocio debe tener unfatcat_owner
, entonces a veces tiene más sentido perder los datos en lugar de tener una actividad no comercial en unbusiness
mesa. -
NO ACTION
– este es esencialmente un método para retrasar la verificación, en MySQL no es diferente aRESTRICT
, pero en PostgreSQL, podría hacer-- Not a real revolution. -- requires constraint be DEFERRABLE INITIALLY DEFERRED BEGIN; SET CONSTRAINTS ALL DEFERRED; DELETE FROM bourgeoisie; INSERT INTO bourgeoisie VALUES ( 'Putin' ); UPDATE business SET fatcat_owner = 'Putin'; END;
En tal sistema, la restricción se valida solo antes de que se confirme la transacción. Esto puede resultar en detener la revolución, pero puede recuperarse en la transacción – para cierto grado de “recuperación”.
-