Jos*_*osa 18 postgresql ddl foreign-keys alter-table
当表名更改后,如何更改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
);
Run Code Online (Sandbox Code Playgroud)
后来我做了:
ALTER TABLE example1 RENAME TO example3;
Run Code Online (Sandbox Code Playgroud)
如何更改外键约束的定义?
example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED,
Run Code Online (Sandbox Code Playgroud)
Erw*_*ter 24
表和/或其他对象之间的内部依赖关系永远不会绑定到对象名称.在内部,每个对象都存储在目录表中,对象的OID(内部主键)用于其他所有对象.
因此,FOREIGN KEY参考被存储在目录表pg_constraint和pg_depend.更改表名称根本不会影响功能.
约束的名称保持不变.您可以忽略它,或者您可能想要重命名约束,这样就不会产生误导.
但是,由于您在创建时未指定约束名称,因此系统选择了一个默认值,example2_example1fk_fkey除非使用了该名称,否则将采用默认值.没有引用引用的表名.但是,列名也可能必须在您的示例中进行更改.而这是在约束条件名称中使用.
ALTER TABLE example2 RENAME example1fk TO example3fk; -- rename column
Run Code Online (Sandbox Code Playgroud)
在Postgres 9.2或更高版本中,您也可以重命名约束(如dequis所述):
ALTER TABLE example2 RENAME CONSTRAINT example2_example1fk_fkey TO example2_example3fk_fkey;
Run Code Online (Sandbox Code Playgroud)
在旧版本中,您必须删除并重新创建约束以重命名它,最好在单个语句中:
ALTER TABLE example2 -- rename constraint
DROP CONSTRAINT example2_example1fk_fkey
, ADD CONSTRAINT example2_example3fk_fkey FOREIGN KEY (example3fk)
REFERENCES example3 (id) DEFERRABLE INITIALLY DEFERRED;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17535 次 |
| 最近记录: |