2010-09-20 8 views
0

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 certain transaction
  • supprimer tous enumeration_values associés à ces classification_items
  • et enfin, supprimer tous les éléments key associés à ceux enumeration_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 ....

+0

duplication possible de [Comment écrire un DELETE CASCADE pour postgres?] (Http://stackoverflow.com/questions/3711580/how-does-one-write-a-delete-cascade-for-postgres) –

+0

Aussi ma question. C'est différent, parce que je demande comment vérifier si la clé étrangère est unique ou non. – AP257

Répondre

1

Si seulement postgres avait un CASCADE SUPPRIMER déclaration ....

PostgreSQL a cette option depuis longtemps, de la version (il y a 5 ans) 8,0. Just use them.

+0

http://www.postgresql.org/docs/7.4/interactive/ddl-constraints.html l'a aussi (sorti en 2003). Je serais surpris si ce n'était pas dans les versions antérieures, aussi. – Unreason

+0

N'a pas jeté un coup d'oeil dans la documentation 7.4;) –

+0

Hélas, cela n'aide pas, parce que ce n'est pas ma base de données - j'en ai hérité, et je n'ai pas l'option pour le reconstruire à partir de zéro. – AP257

Questions connexes