【问题标题】:How to alter "REFERENCES" in PostgreSQL?如何更改 PostgreSQL 中的“参考”?
【发布时间】:2015-10-03 13:16:04
【问题描述】:

当表名已更改时,如何更改对 PostgreSQL 中表的引用?

说我有:

CREATE TABLE example1 (
   id serial NOT NULL PRIMARY KEY,
   name varchar(100)
);

CREATE TABLE example2 (
   id serial NOT NULL PRIMARY KEY,
   example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED
);

稍后我会这样做:

ALTER TABLE example1 RENAME TO example3; 

如何改变外键约束的定义?

example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED,

【问题讨论】:

  • 首先,为了帮助您搜索,这称为外键约束。其次,我不清楚你想做什么。重命名后约束将继续指向表 - Postgres 允许它指向不存在的名称是没有意义的。还是您的意思是要重命名列example1fk 以匹配新表名?
  • IMSoP 是对的:您无需做任何事情。 Postgres 会处理一切。
  • 您是否尝试过重命名并查看它对 FK 约束的影响?

标签: postgresql foreign-keys ddl alter-table


【解决方案1】:

表和/或其他对象之间的内部依赖关系永远不会绑定到对象名称。在内部,每个对象都存储在目录表中,并且对象的 OID(内部主键)用于其他所有内容

因此,FOREIGN KEY 引用存储在目录表pg_constraint(约束本身包括其名称)和pg_depend 中。更改表名完全不会影响功能

约束的名称保持不变。您可以忽略它,或者您可能想要重命名约束,以免产生误导。

但是,由于您在创建时没有指定约束名称,因此系统选择了一个默认值,在您的情况下为 example2_example1fk_fkey,除非该名称被采用。没有引用被引用的 table 名称。但是您的示例中的列名也可能需要更改。 that 用在了约束名中。

ALTER TABLE example2 RENAME example1fk TO example3fk;  -- rename column

在 Postgres 9.2 或更高版本中,您也可以重命名约束(如 dequis commented):

ALTER TABLE example2 RENAME CONSTRAINT example2_example1fk_fkey TO example2_example3fk_fkey;

在旧版本中,您必须删除并重新创建约束才能重命名,最好在单个语句中:

ALTER TABLE example2  -- rename constraint
   DROP CONSTRAINT example2_example1fk_fkey
 , ADD  CONSTRAINT example2_example3fk_fkey FOREIGN KEY (example3fk)
      REFERENCES example3 (id) DEFERRABLE INITIALLY DEFERRED;

Details in the manual.

【讨论】:

  • 自 postgres 9.2 (2012) 以来,ALTER TABLE example2 RENAME CONSTRAINT example2_example1fk_fkey TO example2_example3fk_fkey
  • @dequis:好点,我更新了您的评论参考。
猜你喜欢
  • 2014-01-20
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多