一尘不染

有没有办法在mysql数据库中插入带有前缀的自动增量主ID?

sql

我正在尝试将数据插入为主数据ID,该数据在MySQL数据库中具有一个字母数字值和两个数字值。该数据将自动递增生成数字,但字母数字值将是固定的。像D1,D2
.... D54,D55,D56等。这里,“ D”始终相同,但是数字将自动递增。有什么办法吗?


阅读 215

收藏
2021-03-10

共1个答案

一尘不染

首先, 不建议这样做 ,就像其他评论一样,您可以动态生成此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 |

这是 SQLFiddle 演示

不可靠的 方法是在INSERT语句本身中即时生成新ID

INSERT INTO Table1 (id, ...) 
SELECT CONCAT('D', LPAD(COALESCE(SUBSTR(MAX(id), 2), 0) + 1, 4, '0')),
       ...
  FROM table1

这是 SQLFiddle 演示

这种方法的问题:

  1. 在高负载下,两个并发会话可以获取相同的MAX(id)值,因此生成相同的新id导致插入失败。
  2. 您不能使用多插入语句
2021-03-10