Al hacer:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Errores:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
Aquí están mis tablas:
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
La manera simple sería deshabilitar la verificación de clave externa; realice los cambios y luego vuelva a habilitar la verificación de clave externa.
fuente
REPLACE INTO tab_with_constraint ...
Bajo su diseño actual (posiblemente defectuoso), debe eliminar la fila de la tabla de anunciantes antes de poder eliminar la fila en la tabla de trabajos a la que hace referencia.
Alternativamente, puede configurar su clave externa de modo que una eliminación en la tabla primaria haga que las filas en las tablas secundarias se eliminen automáticamente. Esto se llama una eliminación en cascada. Se parece a esto:
Dicho esto, como ya han señalado otros, su clave externa parece que debería ser al revés ya que la tabla de anunciantes realmente contiene la clave principal y la tabla de trabajos contiene la clave externa. Lo reescribiría así:
Y la eliminación en cascada no será necesaria.
fuente
Si desea soltar una tabla, debe ejecutar la siguiente consulta en un solo paso
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE nombre_tabla;
fuente
Probé la solución mencionada por @Alino Manzi pero no funcionó para mí en las tablas relacionadas con WordPress usando wpdb.
luego modifiqué el código como se muestra a continuación y funcionó
fuente
Creo que su clave externa está al revés. Tratar:
fuente
Si hay más de un trabajo con el mismo ID_anunciante, su clave externa debe ser:
De lo contrario (si es al revés en su caso), si desea que las filas en el anunciante se eliminen automáticamente si se elimina la fila en el trabajo, agregue la opción 'BORRAR CASCADA' al final de su clave externa:
Consulte las restricciones de clave externa
fuente
Debe eliminarlo por orden. Hay dependencia en las tablas
fuente
Cuando crea una base de datos o crea tablas
Debe agregar esa línea en la secuencia de comandos superior crear base de datos o tabla
¿Ahora quieres eliminar registros de la tabla? entonces escribes como
¡Buena suerte!
fuente
¿Qué tal esta alternativa que he estado usando: permita que la clave foránea sea NULL y luego elija ON DELETE SET NULL ?
Personalmente, prefiero usar " ON UPDATE CASCADE " y " ON DELETE SET NULL " para evitar complicaciones innecesarias, pero en su configuración es posible que desee un enfoque diferente. Además, anular valores de clave externa puede provocar complicaciones, ya que no sabrá exactamente qué sucedió allí. Por lo tanto, este cambio debe estar en estrecha relación con el funcionamiento del código de su aplicación.
Espero que esto ayude.
fuente
He tenido este problema en la migración laravel también
el orden de las tablas de caída en hacia abajo () Método sí importa
puede no funcionar, pero si cambia el orden, funciona.
fuente
si necesita dar soporte al cliente lo antes posible y no tiene acceso a
para que la integridad de los datos se pueda deshabilitar:
1) eliminar clave foránea
2) active su operación de eliminación a través de sql o api
3) agregue la clave externa de nuevo al esquema
sin embargo, es una solución urgente, por lo que es bajo su propio riesgo, ya que la falla principal de dicho enfoque es que luego es necesario mantener la integridad de los datos manualmente.
fuente
Puede crear un activador para eliminar las filas a las que se hace referencia antes de eliminar el trabajo.
fuente
El principal problema con este error
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
es que no le permite saber qué tabla contiene la falla FK, por lo que es difícil resolver el conflicto.Si usa MySQL o similar, descubrí que puede crear un diagrama ER para su base de datos, luego puede revisar y eliminar de forma segura cualquier conflicto que desencadene el error.
connection
database
ytables
que necesita examinarfuente
Básicamente, la razón detrás de este tipo de error es que eventualmente está tratando de eliminar una tupla que tiene una clave primaria (tabla raíz) y esa clave primaria se usa en la tabla secundaria como clave externa. En este escenario para eliminar los datos de la tabla primaria, debe eliminar los datos de la tabla secundaria (en los que se usa la clave externa). Gracias
fuente
Esto me sucedió a mí también y debido a una dependencia y referencia de otras tablas, no pude eliminar la entrada. Lo que hice fue agregar una columna de eliminación (de tipo booleano) a la tabla. El valor en ese campo muestra si el elemento está marcado para su eliminación o no. Si está marcado para eliminación, no busque / use; de lo contrario, úsalo.
fuente
Tal vez deberías probar ELIMINAR CASCADA
fuente