2013-05-01 8 views
0

J'ai tables quelque chose commeCascade sur Supprimer sur les tableaux emboîtés

CREATE TABLE A (
Z INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (Z) 
) ENGINE=InnoDB; 

CREATE TABLE B (
Y INT NOT NULL, 
Z INT NOT NULL, 
PRIMARY KEY (Y , Z), 
FOREIGN KEY (Z) 
    REFERENCES A (Z) 
    ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE=InnoDB; 

CREATE TABLE C (
Y INT NOT NULL, 
Z INT NOT NULL, 
PRIMARY KEY (Y , Z), 
FOREIGN KEY (Y) 
    REFERENCES B (Y) 
    ON UPDATE CASCADE ON DELETE CASCADE, 
FOREIGN KEY (Z) 
    REFERENCES B (Z) 
    ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE=InnoDB; 

INSERT INTO A VALUES (1); 
INSERT INTO A VALUES (2); 
INSERT INTO A VALUES (3); 
INSERT INTO B VALUES (4, 2); 
INSERT INTO B VALUES (3, 1); 
INSERT INTO B VALUES (3, 3); 
INSERT INTO B VALUES (4, 3); 
INSERT INTO C VALUES (3, 1); 
INSERT INTO C VALUES (4, 2); 

Si je

DELETE FROM A WHERE Z=3 

mises à jour B correctement et C ne fonctionne pas.

Si je

DELETE FROM B WHERE Z=3 

mises à jour B correctement et C ne fonctionne pas. C sur la cascade est en train de laisser tomber des rangs sans aucun rapport avec quoi que ce soit. En fait, aucune de ces commandes de suppression ne devrait même arriver à C.

Pourquoi est-ce que cela nuke la table C? L'une ou l'autre des suppressions doit supprimer (3,3) et (4,3) dans le tableau B et s'arrêter.

Répondre

1

Le problème était que je supprimais des choses comme si elles étaient distinctes et ne faisaient pas partie d'une clé composite. Je devrais donc avoir dans le tableau C quelque chose le long des lignes de

CREATE TABLE C (
    Y INT NOT NULL, 
    Z INT NOT NULL, 
    PRIMARY KEY (Y , Z), 
    FOREIGN KEY (Y , Z) 
     REFERENCES B (Y , Z) 
     ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE=InnoDB; 

qui prend alors en compte que c'est une clé composite fonctionne correctement.