具有外键约束时更改主键的类型

时间:2015-01-20 16:36:12

标签: sql postgresql foreign-keys primary-key

我有一个包含元素的表:

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命令,以便我可以反映其他表上的更改。

截至目前,数据库中没有任何值,数据库是否已构建。

1 个答案:

答案 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不知道如何翻译它们时才需要。