首先, 不建议这样做 ,就像其他评论一样,您可以动态生成此id值。
但是,尽管如此,至少有两种方法可以实现:
或多或少可靠的 方式涉及使用单独的表进行排序和触发
架构:
CREATE TABLE Table1_seq ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);CREATE TABLE Table1( `id` VARCHAr(10) NOT NULL PRIMARY KEY DEFAULT '', ...);
扳机:
DELIMITER $$CREATE TRIGGER tg_bi_table1BEFORE INSERT ON table1FOR EACH ROWBEGIN INSERT INTO table1_seq() VALUES(); SET NEW.id = CONCAt('D', LPAd(LAST_INSERT_ID(), 4,'0'));END$$DELIMITER ;然后,您只需将行插入
table1
INSERT INTO Table1 () VALUES (),(),();
你会得到
| ID |---------| D0001 || D0002 || D0003 |
这是 SQLFiddle 演示
不可靠的 方法是在
INSERT语句本身中即时生成新ID
INSERT INTO Table1 (id, ...) SELECt CONCAt('D', LPAd(COALESCE(SUBSTr(MAX(id), 2), 0) + 1, 4, '0')), ... FROM table1这是 SQLFiddle 演示
这种方法的问题:
- 在高负载下,两个并发会话可以获取相同的
MAX(id)
值,因此生成相同的新id导致插入失败。 - 您不能使用多插入语句



