2008-10-26 59 views
0

當有一列引用另一列時,我很努力尋找最佳方式來更新該列,同時保持引用完整性。例如,如果我有一張標籤和說明表以及兩個條目:更新Postgres中引用的列

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

現在,我不希望這些副本。我想向不允許大小寫不重複的值的列添加一個約束,如示例中所示。但是,我有幾行其他幾個引用'READ'的表,這是我想要刪除的表。

我知道Postgres知道其他行的哪個字段引用了這個,因爲只要他們在那裏,我就不能刪除它。那麼,我怎麼能得到任何引用它的字段來更新爲'read'?這只是一個例子,實際上我有幾個地方想要這樣做。另一個例子實際上是一些表的int主鍵,我想在其中添加一個新的表作爲一種「基表」,現有的表可以擴展,所以他們現在都需要有唯一的ID,這意味着更新他們擁有的。

我很開放食譜的功能,我可以添加到做到這一點,我可以利用的工具,或其他任何東西。

回答

1

如果您有很多行引用READ,您可以將外鍵更改爲級聯更新,更新該表set 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>' 
+0

mmm ...如果你有'閱讀'和'閱讀'你將無法更新。我認爲所有參考表都應該更新,然後'READ'的記錄下降。對外鍵使用「ON DELETE RESTRICT」,不會有任何風險遺漏。 – piro 2008-10-26 18:43:49

+0

爲什麼不呢?你只需要小心地正確更新,只有那些'讀' – 2008-10-26 19:18:07

0

對於您可以創建欄「標籤」上的唯一索引的未來,例如:

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

或者檢查manual。 這將有助於您下次避免這種情況。