2012-07-29 5 views
3

Je souhaite supprimer des lignes spécifiques de 8 tables. Mon problème est que les lignes sont connectées avec une clé étrangère. Comment puis-je supprimer toutes les données connectées aux lignes spécifiques que je souhaite supprimer? Mes tables incluent des tables de définition (id, nom, valeur max, valeur min ...), tables de données (id, user_id, definition_id, ....) et des tables d'historique (enregistrer chaque modification dans la table de données).Comment supprimer des lignes de la table sql

J'ai pensé utiliser la commande delete on cascade mais je n'ai pas trouvé de moyen de l'utiliser.

+0

Qu'est-ce que SQL utilisez-vous: MySQL, MSSQL, etc ..? – Michael

+1

Vous pouvez le faire avec 8 instructions de suppression, une pour chaque table, dans le bon ordre afin que les contraintes FK ne soient pas violées. –

+0

@Michael j'utilise MySQL – Ofer

Répondre

4

DELETE CASCADE est un attribut de la contrainte de clé étrangère. Malheureusement, ce n'est pas quelque chose que vous pouvez utiliser en tant qu'option avec une instruction DELETE (ce qui serait vraiment cool en fait)

Si vos clés étrangères n'ont pas été déclarées en cascade, vous devez "remonter le temps".

Malheureusement, vous ne nous montrent la structure de votre table réelle si nous supposons quelque chose comme ceci:

 
main_table (main_id) 
    child_one (id, main_id) 
    child_two (id, id_one) 
     child_three (id, id_two) 

(je sais que vous avez dit 8 tables, mais pour le bien de la démonstration, j'écourté un peu, mais cela ne change pas le sous-jacent « stratégie »)

en supposant que vous voulez supprimer la ligne avec main_id = 42 de `main_table:

vous devez d'abord supprimer les lignes de child_three en utilisant quelque chose comme ceci:

delete from child_three 
where id_two in (select id 
       from child_two 
       where id_one in (select id 
            from child_one 
            where main_id = 42); 

Ensuite, supprimez les lignes de child_two:

delete from child_two 
where id_one in (select id 
       from child_one 
       where main_id = 42); 

Puis child_one:

delete from child_one 
where main_id = 42; 

Et enfin la table principale:

delete from main_table 
where id = 42; 

Certains clients SQL peut effectivement générer ces déclarations pour vous. Je ne sais pas si SQL Developer peut cependant.

0

Je suppose que vous utilisez InnoDB Engine, puisque vous parlez de clés étrangères,

sera plus facile de définir correctement la table afin que la suppression agira comme une suppression en cascade.

 CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`) 
     REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 

Voici alink une déclaration correcte créer de table:

How do I use on delete cascade in mysql?

Questions connexes