首先,这样做是不可取的,就像其他人评论的那样,你可以动态生成这个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_table1
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
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 |
不可靠的方法是在INSERT语句本身动态生成新的id
INSERT INTO Table1 (id, ...)
SELECT CONCAT('D', LPAD(COALESCE(SUBSTR(MAX(id), 2), 0) + 1, 4, '0')),
...
FROM table1
这种方法存在的问题:
>在重负载下,两个并发会话可以获取相同的MAX(id)值,从而生成相同的新ID,导致插入失败.>您不能使用多插入语句