Saltar al contenido

Buena explicación del comportamiento en cascada (ON DELETE / UPDATE)

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 businessson 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_ownersy 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 capitalismo bourgeoisie surge y los oligarcas llenan el rollo de la fatcat_owners. Nota importante, la columna debe estar NULLABLE (no NOT NULL) o esto nunca puede suceder.

    • SET DEFAULT – tal vez tuviste un DEFAULT 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 el bourgeoisie va, también lo hace el business. Si un negocio debe tener un fatcat_owner, entonces a veces tiene más sentido perder los datos en lugar de tener una actividad no comercial en un business mesa.

    • NO ACTION – este es esencialmente un método para retrasar la verificación, en MySQL no es diferente a RESTRICT, 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”.

Reseñas y valoraciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *