¿Cómo usar RESTRICT for Foreign Key en mysql?

11

En la estructura de la base de datos de

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Espero eliminar el padre Cityal dejar el valor correspondiente en el niño intacto por estos tres comandos iguales

  FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
  FOREIGN KEY (city) REFERENCES City (name)

Pero cuando se usa NO ACTIONOR RESTRICTo se omite ON DELETE. MySQL no me permite eliminar de la columna principal con este error:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
 ON DELETE RESTRICT

Donde me equivoco ¿No es responsabilidad de los SQL NO ACTIONeliminar al padre y dejar al niño huérfano?

Googlebot
fuente

Respuestas:

13

De acuerdo con la documentación de MySQL sobre ELIMINAR RESTRICCIÓN

• RESTRICT: rechaza la operación de eliminación o actualización de la tabla primaria. Especificar RESTRICT (o NO ACTION) es lo mismo que omitir la cláusula ON DELETE o ON UPDATE.

En cuanto a NO ACCIÓN

• SIN ACCIÓN: una palabra clave del SQL estándar. En MySQL, equivalente a RESTRICT. InnoDB rechaza la operación de eliminación o actualización para la tabla primaria si hay un valor de clave externa relacionado en la tabla referenciada. Algunos sistemas de bases de datos tienen cheques diferidos, y NO ACTION es un cheque diferido. En MySQL, las restricciones de clave externa se verifican de inmediato, por lo que NO ACTION es lo mismo que RESTRICT.

ELIMINAR RESTRICCIÓN protege al padre de la eliminación, no a los hijos.

RolandoMySQLDBA
fuente
5

Si desea eliminar al padre y dejar al hijo, entonces probablemente desee la ON DELETE SET NULLopción:

SET NULL: elimine o actualice la fila de la tabla primaria y establezca la columna o columnas de clave externa en la tabla secundaria en NULL. Se admiten las cláusulas ON DELETE SET NULL y ON UPDATE SET NULL.

Si especifica una acción SET NULL, asegúrese de no haber declarado las columnas en la tabla secundaria como NOT NULL.

Hay un montón de 'no' en esa última oración, así que solo asegúrate de que parent_id pueda ser NULL.

Consulte también esta pregunta relacionada: ¿Cuál es el propósito de SET NULL en las restricciones Eliminar / Actualizar claves externas?

Al definir una clave externa, le ha dicho a la base de datos que no acepte entradas en la tabla secundaria que no tengan un valor correspondiente en el elemento primario.

Derek Downey
fuente