0
votes

Supprimer automatiquement une ligne sans références étrangères

J'utilise SQLite3. J'ai une table "devises" et deux tables qui font référence à la table des devises à l'aide d'une clé étrangère, comme suit:

CREATE TABLE currencies (
     currency        TEXT NOT NULL PRIMARY KEY
    );

CREATE TABLE table1 (
     currency        TEXT NOT NULL PRIMARY KEY,
     FOREIGN KEY(currency) 
        REFERENCES currencies(currency)
    );

CREATE TABLE table2 (
     currency        TEXT NOT NULL PRIMARY KEY,
     FOREIGN KEY(currency) 
        REFERENCES currencies(currency)
    );


0 commentaires

3 Réponses :


1
votes

Il n'y a pas de moyen automatique de faire cela. L'inverse peut traiter des références de clé étrangère en cascade. L'inverse est que lorsqu'une devise est supprimée, toutes les lignes associées sont.

Vous pouvez planifier un emploi quotidien à exécuter quelque chose comme: xxx


0 commentaires

1
votes

Si vous avez besoin d'une manière automatique pour le faire, la plupart des SGBD fournissent un mécanisme de déclenchement. Vous pouvez créer une gâchette sur les opérations de mise à jour et de suppression qui exécutent la requête follable:

Vous pouvez utiliser une jointure gauche pour laquelle: p>

https://www.w3schools.com/sql/sql_join_left.asp p>

Il renvoie une rangée pour toutes les lignes de la table de gauche de la table de gauche , même s'il n'y a pas de ligne correspondante dans la table droite, le remplacement des lignes forme la droite avec NULL. Vous pouvez ensuite vérifier un champ de table à droite non nulle pour NULL avec NULL. Cela filtrera pour les lignes ne contenant pas de contrepartie dans la table droite. P>

Par exemple: P>

DELETE FROM currencies WHERE currency IN (SELECT ...)


2 commentaires

La requête dans l'autre réponse ferait aussi bien.


Ce type de fonctionnement avec la gâchette pourrait coûter plus cher que cela ne vaut.



1
votes

Créer un après la suppression de la gâchette dans chacun des Table1 et Table2 : xxx

chaque fois que cela vous supprimez une ligne dans Table1 ou Table2 , la gâchette impliquée vérifiera l'autre table s'il contient la devise supprimée et s'il ne le fait pas Conticulez, il sera supprimé de devises .

Voir le Demo .


0 commentaires