J'ai quelques tables liées dans une base de données Postgres, comme suit:Postgres: question complexe CASCADE - vous assurer de ne supprimer que les références de clés étrangères uniques?
Table "public.key"
Column | Type | Modifiers
--------+------+-----------
id | text | not null
name | text |
Referenced by:
TABLE "enumeration_value" CONSTRAINT "enumeration_value_key_id_fkey" FOREIGN KEY (key_id) REFERENCES key(id)
Table "public.enumeration_value"
Column | Type | Modifiers
--------+------+-----------
id | text | not null
key_id | text |
Foreign-key constraints:
"enumeration_value_key_id_fkey" FOREIGN KEY (key_id) REFERENCES key(id)
Referenced by:
TABLE "classification_item" CONSTRAINT "classification_item_value_id_fkey" FOREIGN KEY (value_id) REFERENCES enumeration_value(id)
Table "public.classification_item"
Column | Type | Modifiers
----------------+------+-----------
id | text | not null
transaction_id | text |
value_id | text |
Foreign-key constraints:
"classification_item_transaction_id_fkey" FOREIGN KEY (transaction_id) REFERENCES transaction(id)
"classification_item_value_id_fkey" FOREIGN KEY (value_id) REFERENCES enumeration_value(id)
Je veux
- supprimer tous
classification_items
associés à un certaintransaction
- supprimer tous
enumeration_values
associés à cesclassification_items
- et enfin, supprimer tous les éléments
key
associés à ceuxenumeration_values
.
La difficulté est que les éléments key
ne sont pas uniques à enumeration_values
associés (via classification_item
) avec un certain transaction
. Ils sont créés indépendamment et peuvent exister sur plusieurs de ces transactions.
donc je sais comment faire la seconde deux de ces étapes, mais pas le premier:
delete from key where id in (select key_id from enumeration_value where id in (select value_id from "classification_item" where id = (select id from "transaction" where slice_id = (select id from slice where name = 'barnet'))));
# In statement above: help! How do I make sure these keys are ONLY used with these values?
delete from enumeration_value where id in (select value_id from "classification_item" where id = (select id from "transaction" where slice_id = (select id from slice where name = 'barnet')));
delete from classification_item where transaction_id in (select id from "transaction" where slice_id = (select id from slice where name = 'barnet'));
Si seulement postgres avait une déclaration CASCADE SUPPRIMER ....
duplication possible de [Comment écrire un DELETE CASCADE pour postgres?] (Http://stackoverflow.com/questions/3711580/how-does-one-write-a-delete-cascade-for-postgres) –
Aussi ma question. C'est différent, parce que je demande comment vérifier si la clé étrangère est unique ou non. – AP257