Question

Lorsqu'il y a une ou plusieurs colonnes qui en référent une autre, je me bats pour trouver le meilleur moyen de mettre à jour cette colonne tout en maintenant l'intégrité référentielle. Par exemple, si j'ai un tableau d'étiquettes et des descriptions et deux entrées:

Label | Description
------------------------------------
read  | This item has been read
READ  | You read this thing already

Maintenant, je ne veux pas de ces doublons. Je souhaite ajouter à la colonne une contrainte qui n'autorise pas les valeurs qui sont dupliquées sans tenir compte de la casse, comme dans l'exemple. Cependant, j'ai plusieurs lignes de plusieurs autres tables faisant référence à "READ", celle que je veux supprimer.

Je sais que Postgres sait quels champs d'autres lignes font référence à cela, car je ne peux pas le supprimer tant qu'ils sont présents. Alors, comment puis-je obtenir un champ référençant cette mise à jour pour «lire»? Ce n’est qu’un exemple, et j’ai en fait quelques endroits où je veux faire cela. Un autre exemple est en fait une clé primaire int pour quelques tables, dans laquelle je veux ajouter une nouvelle table comme une sorte de 'table de base' que les tables existantes étendent et qui doivent donc toutes avoir un identifiant unique maintenant, ce qui signifie mettre à jour ceux qu'ils ont.

Je suis ouvert aux recettes pour les fonctions que je peux ajouter, les outils que je peux utiliser ou toute autre chose.

Était-ce utile?

La solution

Si vous avez plusieurs lignes référençant READ, vous pouvez modifier la clé étrangère pour une mise à jour en cascade, mettez à jour le jeu de tables Label = 'read', où Label = 'READ' et tout sera corrigé automatiquement. Après cela, vous pouvez modifier à nouveau la contrainte pour qu'elle soit comme avant.

Pour trouver toutes les tables référençant la colonne, vous pouvez utiliser

select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE where
REFERENCED_TABLE_NAME = '<table>' AND REFERENCED_COLUMN_NAME = '<column>'

Autres conseils

Pour l'avenir, vous pouvez créer un index unique sur la colonne "libellé", par exemple:

CREATE UNIQUE INDEX index_name ON table ((lower(label)));

Ou consultez le manuel . Cela vous aiderait à éviter cette situation pour la prochaine fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top