2016-02-27 135 views
1

我正在將我的數據庫從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'), 

回答

2

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數據類型。