从MySQL迁移时在PostgreSQL中创建表时出错

从MySQL迁移时在PostgreSQL中创建表时出错

问题描述:

我正在将我的数据库从MySQL迁移到PostgreSQL.While创建表时我收到了一个我无法解决的错误。我的MySQL查询是这样的。 MySQL查询从MySQL迁移时在PostgreSQL中创建表时出错

CREATE TABLE `configuration` (
    `Name` varchar(300) NOT NULL, 
    `Value` varchar(300) default NULL, 
    `CType` char(1) default NULL, 
    `Size` int(11) default NULL, 
    `CGroup` varchar(50) default NULL, 
    `RestartReq` char(1) NOT NULL default 'Y', 
    `Display` char(1) NOT NULL default 'Y', 
    PRIMARY KEY (`Name`), 
    KEY `CType` (`CType`), 
    CONSTRAINT `configuration_ibfk_1` FOREIGN KEY (`CType`) REFERENCES `conftype` (`CType`) 
)ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin` 

PostgreSQL的查询

CREATE TABLE configuration (
    Name varchar(300) PRIMARY KEY, 
    Value varchar(300) default NULL, 
    CType char(1) default NULL, 
    Size integer default NULL, 
    CGroup varchar(50) default NULL, 
    RestartReq char(1) NOT NULL default 'Y', 
    Display char(1) NOT NULL default 'Y', 
    KEY CType (CType), 
    CONSTRAINT `configuration_ibfk_1` FOREIGN KEY (CType) REFERENCES conftype (CType) 
) 

运行与 psql -h localhost -p 5432 -U postgres -f ps.sql testdb 错误获取

psql:ps.sql:40: ERROR: syntax error at or near "(" at character 287 
    psql:ps.sql:40: LINE 9: KEY CType ('CType'), 

MySQL documentation文件:

KEY通常是INDEX的同义词。

在PostgreSQL,你必须从表中单独创建索引:

CREATE TABLE configuration (
    name varchar(300) PRIMARY KEY, 
    value varchar(300), 
    ctype char(1), 
    size integer, 
    cgroup varchar(50), 
    restartreq boolean NOT NULL DEFAULT true, 
    display boolean NOT NULL DEFAULT true, 
    CONSTRAINT configuration_ibfk_1 FOREIGN KEY (ctype) REFERENCES conftype (ctype) 
); 

CREATE INDEX conf_key ON configuration(ctype); 

其他一些要点:

  • PostgreSQL的标识符(主要是表和列名)是不区分大小写除非是双引号。标准方法是以小写字母和关键字大写。
  • 使用varchar(300)作为PRIMARY KEY通常不是出于性能原因的好主意。考虑添加一个serial类型。
  • 没有指定任何内容时,列的默认值为NULL,因此不需要指定DEFAULT NULL
  • PostgreSQL有一个boolean数据类型。