Comment écrit-on un DELETE CASCADE pour postgres?
Je suis manuellement la construction d'un DELETE CASCADE de déclaration pour postgres.
J'ai une "transaction" et une "tranche" de la table, liés comme indiqué ci-dessous:
Table "public.slice"
Column | Type | Modifiers
----------+------+-----------
id | text | not null
name | text |
Referenced by:
TABLE "transaction" CONSTRAINT "transaction_slice_id_fkey" FOREIGN KEY (slice_id) REFERENCES slice(id)
Table "public.transaction"
Column | Type | Modifiers
----------+------+-----------
id | text | not null
slice_id | text |
Referenced by:
TABLE "classification_item" CONSTRAINT "classification_item_transaction_id_fkey" FOREIGN KEY (transaction_id) REFERENCES transaction(id)
Table "public.classification_item"
Column | Type | Modifiers
----------------+------+-----------
id | text | not null
transaction_id | text |
Foreign-key constraints:
"classification_item_transaction_id_fkey" FOREIGN KEY (transaction_id) REFERENCES transaction(id)
Dire que je veux supprimer toutes les transactions et classification_items référencé par la tranche dont le nom est "my_slice'. Que dois-je écrire?
=# delete from classification_item where transaction_id= #...?
=# delete from transaction where slice_id= #...?
=# delete from slice where name='my_slice';
- Suggestion: Améliorer le bloc de code décrivant la structure de la table. (J'ai essayé d'améliorer ce avec un edit, mais ils l'ont rejeté, il ...) Avec une entité-relation diagramme, cela permettrait d'économiser beaucoup de temps à comprendre la structure de la table. Sinon, il suffit d'utiliser une mise en forme cohérente, de raccourcir les lignes de la largeur de la colonne, et l'utilisation des espaces lignes de la structure du bloc. Les deux dernières lignes ("les contraintes de clé Étrangère") sont redondantes à l'un des "Référencé par" sections. Et dans l'intro, vous mentionnez que vous avez deux tables, mais vous avez trois.
Vous devez vous connecter pour publier un commentaire.
Dans le cas où vous ne pouvez pas faire ce que les autres ont suggéré:
Postgres clés étrangères soutenir les suppressions en CASCADE:
etc
C'est soemthing que défini dans la table plutôt que de le SUPPRIMER de la Requête. Exemple (regardez order_id):
Vous devez utiliser les suppressions en CASCADE, et il devrait être possible de le faire même si vous avez hérité d'un schéma de base de données. Vous serait tout simplement modifier les contraintes à ajouter les suppressions en CASCADE pour les schémas:
Supprimer et recréer les contraintes d'ajouter des suppressions en CASCADE:
Maintenant la requête suivante va supprimer non seulement la
my_slice
enregistrement à partir de la tableslice
, mais aussi de tous les enregistrements de tablestransaction
etclassification_item
référence:Que la procédure fonctionne même si le schéma est créé par un object-relational mapper comme SQLAlchemy. Cependant, dans de tels cas, prendre soin de ré-appliquer ce "patch" chaque fois que le schéma est modifié ou re-créé. Seulement si cela ne peut pas être mis en œuvre automatiquement, il pourrait ne pas être une bonne idée après tout ...
Il peut être déléguée à des SGBD par définir une propriété de contrainte 'delete' = CASCADE. Veuillez voir un exemple.