我有一个包含元素的表:
SGA
----
Pk | Integer (PRIMARY KEY)
and it has 3 - 4 relations
SB1
----
FK1 | Integer (references PK)
SB1
----
FK1 | Integer (references PK)
SB2
----
FK2 | Integer (references PK)
SB3
----
FK3 | Integer (references PK)
我想将PK的类型更改为文本,但它会产生约束错误(这很明显)。是否有SQL命令,以便我可以反映其他表上的更改。
截至目前,数据库中没有任何值,数据库是否已构建。
答案 0 :(得分:0)
你必须像这样明确地更新每个表,没有快捷方式SQL:
ALTER TABLE child DROP CONSTRAINT constraint_name ;
ALTER TABLE child ALTER COLUMN fk_col TYPE new_type;
ALTER TABLE parent ALTER COLUMN pk_col TYPE new_type;
ALTER TABLE child ADD CONSTRAINT constraint_name
FOREIGN KEY fk_col REFERENCES parent(pk_col);
例如:
create temp table foo( i integer primary key);
create temp table bar ( foo_i integer references foo(i) );
insert into foo values (1),(2),(3);
insert into bar values (1),(2),(2);
ALTER TABLE bar DROP CONSTRAINT bar_foo_i_fkey;
ALTER TABLE bar ALTER COLUMN foo_i TYPE text USING 'NUM:'||foo_i;
ALTER TABLE foo ALTER COLUMN i TYPE text USING 'NUM:'||i;
ALTER TABLE bar ADD CONSTRAINT bar_foo_i_fkey
FOREIGN KEY (foo_i) REFERENCES foo(i);
USING
是可选的,只有在您想要在更改类型时进行某种翻译或者postgres不知道如何翻译它们时才需要。