2016-02-07 3 views
0

Donc, je reçois:MySql "ne peut pas mettre à jour la ligne parent" quand j'ai "ON UPDATE CASCADE"

Code d'erreur: 1451. Impossible de supprimer ou mettre à jour une ligne parent: une clé étrangère contrainte échoue (playground. Person, CONTRAINTE sk_Person_Parent FOREIGN KEY (parent_id) RÉFÉRENCES Person (id) ON SUPPRIMER CASCADE ON UPDATE CASCADE)

C'est la table simple, re se classer:

CREATE TABLE IF NOT EXISTS Person (
id int not null primary key, 
name varchar(100) not null, 
parent_id int null, 
CONSTRAINT `sk_Person_Parent` 
    FOREIGN KEY (parent_id) 
    REFERENCES Person (id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
); 

comme vous le voyez, il y a "ON UPDATE CASCADE". I insérer 4 lignes simples qu'elle contient:

INSERT INTO Person(id, name, parent_id) 
VALUES 
(1, 'vasko', NULL), 
(2, 'asdas', 1), 
(3, 'ivo', 1), 
(4, 'anton', 3); 

donc j'ai 1 - vasko 2 - asdasd 3 - ivo 4 - Anton. Lorsque je supprime par l'ID 1, tous les enregistrements sont effacés, à cause de l'ON DELETE CASCADE. Cependant, si j'essaie d'exécuter

UPDATE Person 
SET id=10 
WHERE id=1; 

Je reçois l'erreur donnée. Des idées?

(j'attends id Vasil pour devenir 10, et la parent_id des 2 prochaines lignes à jour à 10)

+0

Il est une approche intéressante clé étrangère. Le problème est le suivant: lorsque vous essayez de changer l'identifiant, ce qui n'est pas habituel, mais disons que c'est bien, il essaie ** ** d'abord de changer la clé étrangère - puisque id = 10 n'existe pas encore, il échoue. Simplement je ne vois aucune solution de contournement pour le résoudre facilement et curieux de voir s'il y en a (autre que l'utilisation de la table temporaire approche peut-être). – smozgur

+0

Eh bien, je lisais un livre de db et il y avait un sujet sur les hiérarchies, alors je voulais expérimenter et ensuite cela m'est venu à l'esprit. Pas un problème qui est critique pour mon travail sur un projet, je me demandais juste. –

+0

SUR MISE À JOUR CASCADE semble être inutile dans cette structure. Je devrais le gérer manuellement pour les enregistrements effectués. Comme je l'ai dit, je suis vraiment curieux de voir s'il y a une solution de contournement. – smozgur

Répondre

2

Il est limitation Mysql:

Si ON UPDATE CASCADE ou ON UPDATE SET NULL recurses pour mettre à jour la même table que celle précédemment mise à jour pendant la cascade, elle agit comme RESTRICT. Cela signifie que vous ne pouvez pas utiliser les opérations auto-référentielles ON UPDATE CASCADE ou ON UPDATE SET NULL.

référence here

+0

Merci, vous avez dit que c'est limite dans Mysql. Connaissez-vous des moteurs DB, que cela fonctionnerait? –