我正在将一些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但是如果没有它,我无法找到合理的方法来实现同样的东西.有任何想法吗?
解决方法:
MysqL为此目的使用AUTO_INCREMENT.您可以将其应用于现有的整数列,而不是创建新的序列类型.
Unfortunately you can only have one per table.
There can be only one AUTO_INCREMENT column per table, it must be indexed, and it cannot have a DEFAULT value.
它们必须是整数,数字不起作用.这可能会改善您的架构,因为9999订单和商品似乎非常小.
AUTO_INCREMENT applies only to integer and floating-point types.
如果这还不够,则不能在多键主键上使用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(列),并且不能将其设置为低于此值.如果表已经填充,那么启动它并不重要.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。