将mysql脚本转换为postgresql脚本

时间:2014-07-14 17:58:29

标签: mysql sql postgresql

我在mysql db的.sql文件中有以下行:

  ALTER TABLE lcr_gw ALTER COLUMN ip_addr TYPE VARCHAR(50) DEFAULT NULL;

我想将其转换为postgresql理解的语法。在我的个人测试中,我只能通过将其分解为两个单独的语句来实现它,如下所示:

ALTER TABLE lcr_gw ALTER COLUMN ip_addr TYPE VARCHAR(50);
ALTER TABLE lcr_gw ALTER COLUMN ip_addr SET DEFAULT NULL;

只是想知道是否有办法将两个语句合并为一个,但postgresql会满意吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您发布的声明根本不是有效的语法
SQL Fiddle

要更改MySQL中的类型,您可以使用CHANGEMODIFY 要更改默认设置,您可以使用DROP DEFAULTSET DEFAULT NULL

如果的目的是更改类型并重置列默认值:

Like in MySQL,您可以将多个操作打包到一个ALTER TABLEstatement in Postgres

ALTER TABLE lcr_gw ALTER COLUMN ip_addr SET DEFAULT NULL
                  ,ALTER COLUMN ip_addr TYPE VARCHAR(50);

Per documentation:

  

提供指定多项更改选项的主要原因   在一个ALTER TABLE中是多个表扫描或重写可以   因此可以合并成一张桌子。

但是如果列上的DEFAULT与新类型不兼容,则必须运行两个单独的语句:

ALTER TABLE lcr_gw ALTER COLUMN ip_addr SET DEFAULT NULL;
ALTER TABLE lcr_gw ALTER COLUMN ip_addr TYPE VARCHAR(50);

无论如何都无关紧要。

答案 1 :(得分:0)

正如@Gordon Linoff在评论中所述,默认情况下,postgreSQL将值设置为null,除非给出一个值或将默认值更改为其他值;

因此,您所需要的只是:

ALTER TABLE lcr_gw ALTER COLUMN ip_addr TYPE VARCHAR(50);

答案 2 :(得分:0)

The PostgreSQL ALTER TABLE syntax diagram没有显示任何方法来组合更改数据类型和更改单个SQL语句中的默认值。在一般情况下,您不能简单地省略set default null。例如,

create table test (
  column_1 char(10) not null default 'a'
);
alter table test alter column column_1 type varchar(50);
insert into test values (default);
select * from test;
column_1
--
a

相反,要么重写为两个独立的语句(您已经知道如何做),要么将其重写为单个事务中的两个语句。