gpt4 book ai didi

mysql - Postgres 序列端口到 MySQL

转载 作者:可可西里 更新时间:2023-11-01 07:25:15 25 4
gpt4 key购买 nike

我正在将一些 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(column) 并且不能设置为低于此值。如果表格已经填充,从什么开始并不重要。

关于mysql - Postgres 序列端口到 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33616950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com