2012-10-25 8 views
1

J'ai quelques tables dont j'ai besoin pour mettre à jour en cascade dans postgresql, mais je ne pense pas que je peux utiliser des clés étrangères pour le faire.SUR MISE À JOUR CASCADE sans clé étrangère dans postgresql

La version simple est que j'ai 4 tables d'objets et 2 tables nouage:

Table X Table A  Table A-B  Table B  Table B-C Table C 
------- --------  ---------  -------  --------- ------- 
x_id   a_id   x_id   b_id   x_id  c_id 
...   ...   a_id   ...   b_id  ... 
...   ...   b_id   ...   c_id  ... 
          ...       ... 

Sur mes tables Nouer, j'ai un PK sur tous les champs id (x_id, a_id, b_id), (x_id, b_id, c_id).

Si je mets à jour b_id dans le tableau A-B, je veux qu'il mette à jour b_id dans le tableau B-C où x_id correspond.

Si je tente de créer une contrainte de clé étrangère, il me dit

« il n'y a pas de contrainte unique de clés correspondantes données pour la table référencée ... »

Je comprends que ça le fait pas parce que (x_id, b_id) n'est pas une contrainte unique, mais cela ne peut pas être le cas, car j'aurai plusieurs c_id avec les mêmes b_id et x_id.

Espérons que cela a du sens.

La seule façon de faire cela avec des déclencheurs?

Répondre

1

Je comprends que ça le fait pas parce que (x_id, b_id) n'est pas une contrainte unique, mais il ne peut pas être, parce que je vais avoir plusieurs de C_Id avec le même b_id et x_id.

Afin d'avoir une mise à jour dans le tableau b_id cascade AB au tableau BC, vous avez besoin

  • une contrainte unique sur une série de colonnes qui comprend TABLE_A-C.b_id,
  • que même ensemble de colonnes dans la table B-C, et
  • une référence de clé étrangère dans la table B-C faisant référence au même ensemble de colonnes dans le tableau A-C, avec ON UPDATE CASCADE.

Ce n'est pas clair pour moi si c'est possible avec votre structure actuelle.

Si

  • TABLE_A-B.x_id est un entier de autoincrementing, il est unique en lui-même, puis
  • dans TABLE_A-B, l'ensemble des colonnes {x_id, b_id} sera aussi unique, et
  • dans Table_B-C, la colonne x_id est un nombre entier (ou bigint), puis
  • dans Table_B-C l'ensemble des colonnes {x_id, b_id} peut avoir une référence de clé étrangère à table_a-C.
Questions connexes