如果您使用的是 Oracle 表服务器,您将使用名为 a 的数据库实体SEQUENCE
来为您的表获取数据库范围内的唯一 id 值。
不过,在 MySQL中模拟实体很容易SEQUENCE
,即使它有点笨拙并且不那么节省空间。
首先,为自己创建一个这样的表。
CREATE TABLE sequence (
sequence_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sequence_id`)
)
然后,创建您的其他表,这些表将使用这些唯一sequence_id
值。这是一个例子:
CREATE TABLE gadget (
sequence_id BIGINT NOT NULL,
gname VARCHAR(20) DEFAULT NULL,
gvalue VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (sequence_id)
)
这是另一个:
CREATE TABLE widget (
sequence_id BIGINT NOT NULL,
wname VARCHAR(20) DEFAULT NULL,
wvalue VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (sequence_id)
)
然后,每当您在其他表中插入一行时,请执行以下操作:
INSERT INTO sequence () VALUES() ;
INSERT INTO widget (sequence_id, wname, wvalue)
VALUES (LAST_INSERT_ID(), 'whatever', 'you_want');
或者,对于另一个示例表,
INSERT INTO sequence () VALUES() ;
INSERT INTO gadget (sequence_id, gname, gvalue)
VALUES (LAST_INSERT_ID(), 'another', 'gadget');
诀窍是:当您将每个(看似空的)行插入到sequence
表中时,它会更新自动增量 sequence_id 字段。然后,当您使用该LAST_INSERT_ID()
函数时,它会检索该 sequence_id 最近插入的值。
要非常小心地保持你的两个INSERT INTO
语句连续,否则这将停止正常工作。
即使数据库服务器的许多不同客户端正在执行插入,这也有效,原因有两个:
- 自动增量是线程安全的。没有两个序列号可以相同。
LAST_INSERT_ID()
为每个与 MySQL 数据库的不同连接维护一个值。不同的程序(或多线程 Web 应用程序中的不同线程)每个都有自己的连接,因此它们每个都有自己的LAST_INSERT_ID()
.
顺便说一句,我使用bigint
了序列的数据,但 int
也可以正常工作。