Postgres序列端口到MySQL

时间:2015-11-09 19:43:50

标签: mysql sql postgresql

我将一些Postgres SQL移植到MySQL,并尝试将三列的起始值设置为特定值。表格如下:

CREATE TABLE ITEM  (
ORDID               NUMERIC(4) NOT NULL,
ITEMID              NUMERIC(4) NOT NULL,
PRODID              NUMERIC(6),
ACTUALPRICE         NUMERIC(8,2),
QTY                 NUMERIC(8),
ITEMTOT             NUMERIC(8,2),
CONSTRAINT ITEM_FOREIGN_KEY FOREIGN KEY (ORDID) REFERENCES ORD (ORDID),
CONSTRAINT ITEM_PRIMARY_KEY PRIMARY KEY (ORDID,ITEMID));

我尝试移植的代码如下:

CREATE SEQUENCE ORDID
INCREMENT BY 1
START WITH 622
;

CREATE SEQUENCE PRODID
INCREMENT BY 1
START WITH 200381
;

CREATE SEQUENCE CUSTID
INCREMENT BY 1
START WITH 109
;

但是,在尝试运行时,我收到错误:

SQL query:

CREATE SEQUENCE ORDIDINCREMENT BY 1 START WITH 622 ;


MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SEQUENCE ORDID
INCREMENT BY 1
START WITH 622' at line 1 

我知道在MySQL中没有直接等同于SEQUENCE但是如果没有它,我无法找到合理的方法来实现同样的东西。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用带AUTO_INCREMENT键的表来模拟序列:

CREATE TABLE ORDID (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 622;
CREATE TABLE PRODID (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 200381;
CREATE TABLE CUSTID (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 109;

每个表都代表一个'序列'。要在CREATE TABLE中使用一个:

CREATE TABLE ITEM  (
ORDID               INT NOT NULL,
ITEMID              NUMERIC(4) NOT NULL,
PRODID              NUMERIC(6),
ACTUALPRICE         NUMERIC(8,2),
QTY                 NUMERIC(8),
ITEMTOT             NUMERIC(8,2),
CONSTRAINT ITEM_FOREIGN_KEY FOREIGN KEY (ORDID) REFERENCES ORDID (ID),
CONSTRAINT ITEM_PRIMARY_KEY PRIMARY KEY (ORDID,ITEMID));

然后,您可以使用INSERT从“序列”中获取新值:

INSERT INTO ordid VALUES (null);
SELECT LAST_INSERT_ID();

答案 1 :(得分:2)

您可以使用AUTO_INCREMENT字段创建一个表并设置其初始值。

 create table myseq(
   my_id   int auto_increment primary key
 ) auto_increment=100;

或者使用ALTER TABLE随时重置值:

 alter table myseq auto_increment = 100;

答案 2 :(得分:2)

MySQL为此目的使用AUTO_INCREMENT。不是创建新的序列类型,而是将其应用于现有的整数列。

Unfortunately you can only have one per table.

  

每个表只能有一个AUTO_INCREMENT列,必须编制索引,并且不能有DEFAULT值。

它们必须是整数,数字不起作用。这可能会改善您的架构,因为9999订单和商品似乎非常小。

  

AUTO_INCREMENT仅适用于整数和浮点类型。

如果这还不够,您就无法在多键主键上拥有AUTO_INCREMENT。只有极其劣质的MyISAM表格才允许这样做。

所以你不能轻易地将你的PostgreSQL表格逐字翻译成MySQL。

您确定要转换为MySQL吗?

在您的情况下,item.ordid是一个引用,因此它将在其自己的表中递增。 item.prodid可能也是一个参考,有人忘了宣布它。这只留下item.itemid声明为AUTO_INCREMENT,但它是主键的一部分。它可能不是必须的,它可以是唯一的。

事实上,ITEM表似乎更像是跟踪产品订单,而不是商品......但那时还有产品ID?我不知道"项目"是

你结束了这样的事情:

CREATE TABLE ITEM (
       ITEMID              INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
       PRODID              INTEGER REFERENCES PROD(PRODID),
       ORDID               INTEGER NOT NULL REFERENCES ORD (ORDID),
       ACTUALPRICE         NUMERIC(8,2),
       QTY                 NUMERIC(8),
       ITEMTOT             NUMERIC(8,2),

       UNIQUE(ORDID, ITEMID)
)

CREATE TABLE ORD (
       ORDID               INTEGER PRIMARY KEY AUTO_INCREMENT,
       ...
) AUTO_INCREMENT = 622;

CREATE TABLE PROD (
       PRODID              INTEGER PRIMARY KEY AUTO_INCREMENT,
       ...
) AUTO_INCREMENT = 200381;

您还可以使用ALTER TABLE在事后设置AUTO_INCREMENT起点。因为它是一个表属性,而不是列属性,所以它发生在表本身上。

ALTER TABLE CUST AUTO_INCREMENT=109;

如果您要导入现有数据集,则很难设置AUTO_INCREMENT起点。 AUTO_INCREMENT将始终使用MAX(column),并且不能将其设置为低于此值。如果表已经填充,那么启动它并不重要。