将MySQL转换为postgres并保留默认值

时间:2015-08-01 01:49:35

标签: mysql postgresql

我有一个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”命令再次应用?

1 个答案:

答案 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。