MySQL 序列
MySQL 没有独立 SEQUENCE,靠 AUTO_INCREMENT 实现自增。
Key Points需要跨表或自定义步长的「序列」时,可用一张计数器表模拟。
AUTO_INCREMENT
SQL
CREATE TABLE seq_demo (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
v VARCHAR(20)
);
INSERT INTO seq_demo (v) VALUES ('a'), ('b');
SELECT * FROM seq_demo;Output
+----+------+
| id | v |
+----+------+
| 1 | a |
| 2 | b |
+----+------+自定义序列表
SQL
CREATE TABLE seq (name VARCHAR(20) PRIMARY KEY, val INT NOT NULL);
INSERT INTO seq VALUES ('order_no', 1000);
-- 取号并自增(事务内)
UPDATE seq SET val = LAST_INSERT_ID(val + 1) WHERE name = 'order_no';
SELECT LAST_INSERT_ID();Output
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1001 |
+------------------+PostgreSQL has a native SEQUENCE; MySQL doesn't, so AUTO_INCREMENT is the norm. For 'date + sequence' order numbers, let the auto-increment handle the number and prepend the date in app code.
AUTO_INCREMENT
SQL
CREATE TABLE seq_demo (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
v VARCHAR(20)
);
INSERT INTO seq_demo (v) VALUES ('a'), ('b');
SELECT * FROM seq_demo;Output
+----+------+
| id | v |
+----+------+
| 1 | a |
| 2 | b |
+----+------+自定义序列表
SQL
CREATE TABLE seq (name VARCHAR(20) PRIMARY KEY, val INT NOT NULL);
INSERT INTO seq VALUES ('order_no', 1000);
-- 取号并自增(事务内)
UPDATE seq SET val = LAST_INSERT_ID(val + 1) WHERE name = 'order_no';
SELECT LAST_INSERT_ID();Output
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1001 |
+------------------+PostgreSQL 有原生
SEQUENCE,MySQL 没有,所以大多用 AUTO_INCREMENT。若业务要「订单号 = 日期 + 自增」,自增列只管数字部分,前缀在应用层拼。