我有一个MySQL数据库,我想转换成Postgres。我遇到的一个问题是将tinyint(1)(同义词到布尔)列转换为“true”布尔值并保留MySQL列的默认值,该值可以是0或1,但在Postgres中,相应的值为true或false。我正在尝试的SQL:
ALTER TABLE "payments" ALTER COLUMN "is_automatic" TYPE boolean USING CAST("is_automatic" as boolean);
错误消息:
ERROR: default for column "is_automatic" cannot be cast automatically to type boolean
我认为以某种方式投射此值是可能的。这是可能的,还是我必须手动将其添加到迁移脚本中?
编辑:我意识到我可能有点含糊地解释了这个问题,抱歉。我正在使用此脚本(https://github.com/lanyrd/mysql-postgresql-converter)来转换MySQL数据库。使用这个脚本将值转换为“true”postgres布尔值,但是最初在MySQL中用布尔值(由tinyint(1)表示)的列本身会丢弃它们的默认值。这发生在脚本的第157行,并且删除命令的“DROP DEFAULT”部分会产生上面的错误,因为它无法生成(我猜)。我的问题最好用这种方式询问:在转换tinyint(1)列的过程中,默认值是否可以“记住”,然后再用“SET DEFAULT”命令再次应用?
答案 0 :(得分:2)
postgresql ALTER TABLE参考页面的示例完全涵盖了这种情况:
..当列具有自动赢得的默认表达式时 转换为新数据类型:
ALTER TABLE foo ALTER COLUMN foo_timestamp DROP DEFAULT, ALTER COLUMN foo_timestamp TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second', ALTER COLUMN foo_timestamp SET DEFAULT now();
因此,您需要删除旧的默认值,更改类型,然后添加新的默认值。
请注意,USING表达式与默认值无关。它纯粹用于转换表中的现有值。但无论如何,整数和布尔值之间没有直接转换,所以你需要一个更高级的USING表达式。
您的陈述可能如下所示:
ALTER TABLE payments
ALTER COLUMN is_automatic DROP DEFAULT,
ALTER COLUMN is_automatic TYPE BOOLEAN
USING is_automatic!=0,
ALTER COLUMN is_automatic SET DEFAULT TRUE;
使用表达式可能需要稍微调整一下,我假设你的现有数据的值为0表示false,其他表示true。