2008-10-26 60 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。 这将有助于您下次避免这种情况。