Postgresの参照列を更新する
-
04-07-2019 - |
質問
別の列を参照する列が1つ以上ある場合、参照整合性を維持しながらその列を更新する最良の方法を探しています。たとえば、ラベルと説明の表と2つのエントリがある場合:
Label | Description
------------------------------------
read | This item has been read
READ | You read this thing already
今、私はこれらの複製が欲しくありません。例のように、大文字と小文字を区別せずに重複する値を許可しない制約を列に追加します。ただし、削除する「READ」を参照する他のいくつかのテーブルの複数の行があります。
Postgresは、他の行のどのフィールドがこれを参照しているかを知っています。なぜなら、そこにある限り削除できないからです。それで、これを参照するフィールドを取得して「読み取り」に更新するにはどうすればよいですか?これは単なる例であり、実際にこれを行いたい場所がいくつかあります。別の例は、実際には、いくつかのテーブルのint主キーです。ここでは、既存のテーブルが拡張する一種の「ベーステーブル」として新しいテーブルを追加します。彼らが持っているもの。
これを行うために追加できる機能、利用できるツール、その他のレシピを公開しています。
解決
READを参照する行が多数ある場合、カスケード更新に外部キーを変更し、Label = 'read'のテーブルセットLabel = 'read'を更新すると、すべてが自動的に修正されます。その後、以前と同じように制約を再度変更できます。
列を参照しているすべてのテーブルを見つけるには、次を使用できます
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>'
他のヒント
将来、列&quot; label&quot;に一意のインデックスを作成できます。例:
CREATE UNIQUE INDEX index_name ON table ((lower(label)));
またはマニュアルを確認してください。 これは、次回この状況を回避するのに役立ちます。
所属していません StackOverflow