当有一个或多个列引用另一个列时,我正在努力寻找更新该列的最佳方法,同时保持参照完整性。例如,如果我有一个标签和描述表以及两个条目:

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

现在,我不希望这些重复。我想在列中添加一个约束,该约束不允许不区分大小写的值重复,如示例中所示。但是,我有几行其他几个引用'READ'的表,我想放弃它。

我知道Postgres知道其他行的哪些字段引用了这个,因为只要它们存在就不能删除它。那么,我怎样才能让任何引用它的字段更新为'read'?这只是一个例子,我实际上有几个地方我想这样做。另一个例子实际上是几个表的int主键,我想在其中添加一个新表作为现有的表扩展的“基表”,因此它们现在都需要有唯一的ID,这意味着更新他们拥有的那些。

我对我可以添加的功能,我可以使用的工具或其他任何东西的配方持开放态度。

有帮助吗?

解决方案

如果有很多行引用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>'

其他提示

将来您可以在列“标签”上创建唯一索引,例如:

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

或查看手册。 这将有助于您在下次避免这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top