【发布时间】:2020-09-29 17:28:50
【问题描述】:
在过去的几天里,我已经从 MySQL 迁移到 Postgres。但没有任何成功。我现在已经将我的 MySQL 数据库移植到 Postgres,但我在 VARCHAR 中使用 MySQL 中的 UUID。现在我想去 postgres,但我似乎不可能将 postgres 中的 varchar 转移到 UUID。因为数据库不是空的,所以存在外键约束。我想我可以通过以下方式将它们全部关闭:
set session_replication_role to replica;
我还尝试关闭表的所有触发器。例如,这是我尝试运行的查询:
ALTER TABLE building_block_buildingblock DISABLE TRIGGER ALL;
ALTER TABLE building_block_buildingblockhistory DISABLE TRIGGER ALL;
ALTER TABLE building_block_buildingblockhistory ALTER COLUMN id SET DATA TYPE UUID USING (uuid_generate_v4());
ALTER TABLE building_block_buildingblock ALTER COLUMN id SET DATA TYPE UUID USING (uuid_generate_v4());
ALTER TABLE building_block_buildingblockhistory ALTER column building_block_id SET DATA TYPE UUID USING (uuid_generate_v4());
但我得到了错误:
SQL Error [42804]: ERROR: foreign key constraint "building_block_buildingbl_building_block_id_e08cbc73_fk" cannot be implemented
Detail: Key columns "building_block_id" and "id" are of incompatible types: character varying and uuid.
我还尝试将其包装在一个函数中,如下所示:PostgreSQL - disabling constraints
这是我试过的功能:
CREATE OR REPLACE FUNCTION f() RETURNS void AS
$BODY$
begin
set session_replication_role to replica;
SET CONSTRAINTS ALL deferred;
ALTER TABLE building_block_buildingblock DISABLE TRIGGER ALL;
ALTER TABLE building_block_buildingblockhistory DISABLE TRIGGER ALL;
ALTER TABLE building_block_buildingblockhistory ALTER COLUMN id SET DATA TYPE UUID USING (uuid_generate_v4());
ALTER TABLE building_block_buildingblock ALTER COLUMN id SET DATA TYPE UUID USING (uuid_generate_v4());
ALTER TABLE building_block_buildingblockhistory ALTER column building_block_id SET DATA TYPE UUID USING (uuid_generate_v4());
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
select f();
有没有办法进行我想做的这种迁移?我现在唯一能想到的就是手动调整我的 SQL 转储文件。但这听起来不仅工作量很大,而且容易出错。
【问题讨论】:
-
您发布的语句更改了列类型,它们不会禁用任何约束
-
这能回答你的问题吗? PostgreSQL - disabling constraints
-
我更新了我的答案。它似乎没有帮助
标签: sql postgresql