【问题标题】:Updating referenced columns in Postgres更新 Postgres 中的引用列
【发布时间】:2008-10-26 18:10:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: database postgresql migration


    【解决方案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>'
    

    【讨论】:

    • mmm...如果您同时拥有“已读”和“已读”,您将无法更新。我认为应该更新所有引用表,然后删除带有“READ”的记录。在外键上使用“ON DELETE RESTRICT”不会有遗漏任何内容的风险。
    • 为什么不呢?你只需要小心正确更新,只有那些带有'READ'的
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我知道这一点,但问题的关键是如何从无法防止这种情况的模式迁移,以及如何在其他需要这样做的情况下更新引用的字段.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多