1

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

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

现在,我不想要这些重复。我想向不允许不区分大小写重复的值的列添加一个约束,如示例中所示。但是,我有几行引用“READ”的其他几个表,我想删除那个。

我知道 Postgres 知道其他行的哪些字段正在引用它,因为只要它们在那里,我就无法删除它。那么,我怎样才能让任何引用它的字段更新为“读取”?这只是一个例子,我实际上有几个地方想要这样做。另一个例子实际上是几个表的 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 回答