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)
);
3 Réponses :
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: p>
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 ...)
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.
Créer un chaque fois que cela vous supprimez une ligne dans Voir le Demo . après la suppression de la gâchette code> dans chacun des Table1 code> et Table2 code>: Table1 code> ou Table2 code>, la gâchette impliquée vérifiera l'autre table s'il contient la devise supprimée code> et s'il ne le fait pas Conticulez, il sera supprimé de devises code>. p>
p> p>