如何改变PostgreSQL中的“REFERENCES”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何改变PostgreSQL中的“REFERENCES”?相关的知识,希望对你有一定的参考价值。

当表名更改后,如何更改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(内部主键)用于其他所有对象。

因此,FOREIGN KEY参考存储在目录表pg_constraintpg_depend中。更改表名称根本不会影响功能。

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

但是,由于您没有在创建时指定约束名称,系统会选择一个默认值,在您的情况下为example2_example1fk_fkey,除非使用了该名称。没有引用引用的表名。但是,列名也可能必须在您的示例中进行更改。这在约束名称中使用。

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.

以上是关于如何改变PostgreSQL中的“REFERENCES”?的主要内容,如果未能解决你的问题,请参考以下文章

djang项目中的疑问及解决办法(ValueError: Invalid model reference 'apps.user.User'. String model referenc

djang项目中的疑问及解决办法(ValueError: Invalid model reference 'apps.user.User'. String model referenc

lib1funcs.S(用于解决裸板实现 printf 中的问题: undefined reference to `__aeabi_uidivmod' 和 undefined referenc

PostgreSQL删除数据

PostgreSQL - 改变数字的精度?

postgresql如何升级版本