En faisant:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Il erreurs:
#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))
Voici mes tableaux:
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`);
Le moyen le plus simple serait de désactiver la vérification de la clé étrangère; effectuez les modifications, puis réactivez la vérification de la clé étrangère.
la source
REPLACE INTO tab_with_constraint ...
Dans le cadre de votre conception actuelle (éventuellement défectueuse), vous devez supprimer la ligne de la table des annonceurs avant de pouvoir supprimer la ligne dans la table des emplois à laquelle elle fait référence.
Vous pouvez également configurer votre clé étrangère de telle sorte qu'une suppression dans la table parente entraîne la suppression automatique des lignes des tables enfants. C'est ce qu'on appelle une suppression en cascade. Cela ressemble à quelque chose comme ceci:
Cela dit, comme d'autres l'ont déjà souligné, votre clé étrangère semble devoir aller dans l'autre sens puisque la table des annonceurs contient vraiment la clé primaire et la table des emplois contient la clé étrangère. Je le réécrirais comme ceci:
Et la suppression en cascade ne sera pas nécessaire.
la source
Si vous souhaitez supprimer une table, vous devez exécuter la requête suivante en une seule étape
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE nom_table;
la source
J'ai essayé la solution mentionnée par @Alino Manzi mais cela n'a pas fonctionné pour moi sur les tables liées à WordPress utilisant wpdb.
puis j'ai modifié le code comme ci-dessous et cela a fonctionné
la source
Je pense que votre clé étrangère est à l'envers. Essayer:
la source
S'il y a plus d'un emploi ayant le même advertiser_id, votre clé étrangère doit être:
Sinon (si c'est l'inverse dans votre cas), si vous voulez que les lignes de l'annonceur soient automatiquement supprimées si la ligne de la tâche est supprimée, ajoutez l'option `` ON DELETE CASCADE '' à la fin de votre clé étrangère:
Découvrez les contraintes de clé étrangère
la source
Vous devez le supprimer par ordre Il y a des dépendances dans les tables
la source
Lorsque vous créez une base de données ou créez des tables
Vous devez ajouter cette ligne en haut script créer une base de données ou une table
Vous souhaitez maintenant supprimer des enregistrements de la table? alors vous écrivez comme
Bonne chance!
la source
Que diriez-vous de cette alternative que j'ai utilisée: autorisez la clé étrangère à être NULL , puis choisissez ON DELETE SET NULL .
Personnellement, je préfère utiliser à la fois " ON UPDATE CASCADE " et " ON DELETE SET NULL " pour éviter des complications inutiles, mais sur votre configuration, vous voudrez peut-être une approche différente. De plus, l'utilisation de valeurs de clé étrangère NULL peut entraîner des complications, car vous ne saurez pas ce qui s'y est exactement passé. Ce changement doit donc être en relation étroite avec le fonctionnement de votre code d'application.
J'espère que cela t'aides.
la source
J'ai eu ce problème dans la migration laravel aussi
l'ordre des tables de dépôt dans la méthode down () importe
peut ne pas fonctionner, mais si vous modifiez l'ordre, cela fonctionne.
la source
si vous avez besoin de soutenir le client dès que possible et que vous n'avez pas accès à
afin que l'intégrité des données puisse être désactivée:
1) supprimer la clé étrangère
2) Activez votre opération de suppression via sql ou api
3) ajoutez la clé étrangère au schéma
cependant, il s'agit d'un correctif, donc c'est à vos risques et périls, car le principal défaut d'une telle approche est qu'elle est nécessaire par la suite pour conserver l'intégrité des données manuellement.
la source
Vous pouvez créer un déclencheur pour supprimer les lignes référencées avant de supprimer le travail.
la source
Le principal problème avec cette erreur
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
est qu'il ne vous permet pas de savoir quelle table contient l'échec FK, il est donc difficile de résoudre le conflit.Si vous utilisez MySQL ou similaire, j'ai découvert que vous pouvez créer un diagramme ER pour votre base de données, vous pouvez alors examiner et supprimer en toute sécurité tout conflit déclenchant l'erreur.
connection
database
ettables
que vous devez examinerla source
Fondamentalement, la raison derrière ce type d'erreur est finalement que vous essayez de supprimer un tupple qui a une clé primaire (table racine) et cette clé primaire est utilisée dans la table enfant comme clé étrangère. Dans ce scénario, pour supprimer les données de la table parent, vous devez supprimer les données de la table enfant (dans lesquelles la clé étrangère est utilisée). Merci
la source
Cela m'est également arrivé et en raison d'une dépendance et d'une référence à d'autres tables, je n'ai pas pu supprimer l'entrée. Ce que j'ai fait, c'est ajouté une colonne de suppression (de type booléen) à la table. La valeur de ce champ indique si l'élément est marqué pour suppression ou non. Si marqué pour suppression, ne pas chercher / utiliser; sinon, utilisez-le.
la source
Peut-être devriez-vous essayer ON DELETE CASCADE
la source