当有一个或多个列引用另一个列时,我正在努力寻找更新该列的最佳方法,同时保持参照完整性。例如,如果我有一个标签和描述表以及两个条目:
Label | Description
------------------------------------
read | This item has been read
READ | You read this thing already
现在,我不希望这些重复。我想在列中添加一个约束,该约束不允许不区分大小写的值重复,如示例中所示。但是,我有几行其他几个引用'READ'的表,我想放弃它。
我知道Postgres知道其他行的哪些字段引用了这个,因为只要它们存在就不能删除它。那么,我怎样才能让任何引用它的字段更新为'read'?这只是一个例子,我实际上有几个地方我想这样做。另一个例子实际上是几个表的int主键,我想在其中添加一个新表作为现有的表扩展的“基表”,因此它们现在都需要有唯一的ID,这意味着更新他们拥有的那些。
我愿意接受我可以添加的功能,我可以使用的工具或其他任何功能。
答案 0 :(得分:1)
如果有很多行引用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>'
答案 1 :(得分:0)
将来您可以在“label”列上创建一个唯一索引,例如:
CREATE UNIQUE INDEX index_name ON table ((lower(label)));
或查看manual。 这将有助于您在下次避免这种情况。