1

別の列を参照する列が 1 つ以上ある場合、参照整合性を維持しながらその列を更新する最善の方法を探しています。たとえば、ラベルと説明のテーブルと 2 つのエントリがあるとします。

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

今、私はこれらの重複を望んでいません。例のように、大文字と小文字を区別せずに重複する値を許可しない列に制約を追加したいと考えています。ただし、削除したい「READ」を参照する他のいくつかのテーブルの行がいくつかあります。

Postgres は、他の行のどのフィールドがこれを参照しているかを知っています。そこにある限り削除できないためです。では、これを参照するフィールドを取得して「読み取り」に更新するにはどうすればよいでしょうか? これはほんの一例で、実際にやりたいところがいくつかあります。もう 1 つの例は、実際にはいくつかのテーブルの int 主キーです。新しいテーブルを、既存のテーブルを拡張する一種の「ベース テーブル」として追加したいので、すべてのテーブルに一意の ID が必要になります。つまり、更新することを意味します。彼らが持っているもの。

これを行うために追加できる関数のレシピ、利用できるツール、またはその他何でも受け入れます。

4

2 に答える 2

1

READ を参照する行が多数ある場合、外部キーをカスケード更新に変更し、そのテーブル セット Label = 'read' where 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>'
于 2008-10-26T18:18:01.450 に答える
0

将来的には、列「ラベル」に一意のインデックスを作成できます。次に例を示します。

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

または、マニュアルを確認してください。これにより、次回このような状況を回避できます。

于 2008-10-26T21:38:10.143 に答える