如何更改 PostgreSQL 中的“REFERENCES”?

2024-07-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,

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

因此,一个FOREIGN KEY参考存储在目录表中pg_constraint https://www.postgresql.org/docs/current/catalog-pg-constraint.html(约束本身包括其名称)和pg_depend https://www.postgresql.org/docs/current/catalog-pg-depend.html。更改表名完全不会损害功能.

The name的约束保持不变。您可以忽略它,或者您可能想要重命名该约束,这样它就不会产生误导。

但是,由于您在创建时没有指定约束名称,因此系统选择了默认值,即example2_example1fk_fkey在你的情况下,除非名字被占用。没有参考引用的内容table姓名。但是列名在你的例子中也可能需要改变。和that用于约束名称。

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

在 Postgres 9.2 或更高版本中,您也可以重命名约束(如德奎斯评论 https://stackoverflow.com/questions/31414462/how-to-alter-references-in-postgresql/31419767?noredirect=1#comment83981582_31419767):

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;

手册中有详细说明。 https://www.postgresql.org/docs/current/sql-altertable.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 PostgreSQL 中的“REFERENCES”? 的相关文章

随机推荐