如何在PostgreSQL中修改“REFERENCES”?

37

当表名更改时,我该如何修改对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,

1
首先,为了帮助您搜索,这被称为外键约束。其次,我不清楚您想要做什么。在重命名后,约束将继续指向表 - 对于Postgres来说,允许它指向不存在的名称是没有意义的。或者您是指想要将列“example1fk”的名称更改为与新表名称匹配? - IMSoP
IMSoP是正确的:你不需要做任何事情。Postgres会处理一切。 - user330315
你试过重命名并查看它对外键约束的影响了吗? - Craig Ringer
1个回答

52

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

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

约束的名称保持不变。您可以忽略它,或者您可能希望重新命名约束,以使其不会误导。

但是,由于您在创建时没有指定约束名称,因此系统选择了一个默认值,这在您的情况下是example2_example1fk_fkey,除非名称已被使用。对所引用的表格名称没有引用。但是,在您的示例中,列名也可能需要更改。并且那个用于约束名称。

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

在Postgres 9.2或更高版本中,您也可以重命名约束(正如dequis评论的那样):

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;

手册中有详细内容。


7
自从PostgreSQL 9.2(2012年)起,就可以使用ALTER TABLE example2 RENAME CONSTRAINT example2_example1fk_fkey TO example2_example3fk_fkey修改表example2中外键约束example2_example1fk_fkey的名称为example2_example3fk_fkey。 - dequis
1
@dequis:好观点,我已经更新并引用了你的评论。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接