Frage

Wenn es eine von mehreren Spalten sind, die eine andere Referenz, ich kämpfe für die beste Weg, um die Spalte zu aktualisieren, während die referentielle Integrität erhalten bleibt. Zum Beispiel, wenn ich eine Tabelle von Etiketten und Beschreibungen und zwei Einträge:

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

Nun, ich will nicht, diese Duplikate. Ich möchte eine Einschränkung auf die Spalte hinzufügen, die Werte nicht zulässt, dass die Fall-unsensibel Duplikate sind, wie in dem Beispiel. Allerdings habe ich mehrere Reihen von mehreren anderen Tabellen Referenzierung ‚lesen‘, die ich fallen soll.

Ich weiß, Postgres weiß, welche Felder von anderen Zeilen diese verweisen, weil ich es nicht gelöscht werden kann, solange sie da sind. So, wie könnte ich jedes Feld bekommen dies zu ‚lesen‘ zu aktualisieren werben? Dies ist nur ein Beispiel, und ich habe tatsächlich ein paar Orte, die ich dies tun will. Ein weiteres Beispiel ist eigentlich ein int Primärschlüssel für ein paar Tische, wo ich eine neue Tabelle als eine Art ‚Basistabelle‘ hinzugefügt werden soll, dass die bestehenden erweitern und so werden sie alle müssen jetzt eindeutige IDs haben, die Aktualisierungsmittel diejenigen, die sie haben.

Ich bin offen für Rezepte für Funktionen kann ich hinzufügen, dies zu tun, können Werkzeuge, die ich nutzen, oder irgendetwas anderes.

War es hilfreich?

Lösung

Wenn Sie viele Zeilen Referenzierung READ haben, können Sie den Fremdschlüssel ändern auf Kaskade-Update sein, aktualisieren Sie die Tabelle Set Label = ‚lesen‘, wo Label = ‚lesen‘ und alles wird automatisch repariert. Danach können Sie die Einschränkung ändern wieder wie vorher zu sein.

Um alle Tabellen Referenzierung der Spalte zu finden, können Sie

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>'

Andere Tipps

Für die Zukunft könnten Sie einen eindeutigen Index für die Spalte „Bezeichnung“ erstellen, zum Beispiel:

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

oder besuchen Sie die Handbuch . Das würde helfen, diese Situation für das nächste Mal zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top