我在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会满意吗?
谢谢!
答案 0 :(得分:1)
您发布的声明根本不是有效的语法:
SQL Fiddle
要更改MySQL中的类型,您可以使用CHANGE
或MODIFY
要更改默认设置,您可以使用DROP DEFAULT
或SET DEFAULT NULL
。
如果的目的是更改类型并重置列默认值:
Like in MySQL,您可以将多个操作打包到一个ALTER TABLE
statement in Postgres。
ALTER TABLE lcr_gw ALTER COLUMN ip_addr SET DEFAULT NULL
,ALTER COLUMN ip_addr TYPE VARCHAR(50);
提供指定多项更改选项的主要原因 在一个
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
相反,要么重写为两个独立的语句(您已经知道如何做),要么将其重写为单个事务中的两个语句。