当前位置: 首页 > 面试题库 >

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

郝昊天
2023-03-14
问题内容

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


问题答案:

首先, 不建议这样做 ,就像其他评论一样,您可以动态生成此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. 您不能使用多插入语句


 类似资料:
  • 在JPA中,是否有任何方法可以在DB中批量插入数据,并且只有在DB中不存在数据时才插入数据。当我尝试批量插入时,由于唯一键约束,它抛出异常。我想插入数据库中不存在的所有记录,其余的应该跳过。 组织。springframework。刀。DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[reference_number_master_id_key];

  • 问题内容: 我创建了一个具有主键的表并启用了该表,如何使用MYSQL ? 这是我使用的查询,我尝试使用“”和“ 1”作为第一个值,但是它不起作用。 问题答案: 为了利用列的自动递增功能,在插入行时不要为该列提供值。数据库将为您提供一个值。

  • 问题内容: 我正在尝试更改没有主键或auto_increment列的表。我知道如何添加主键列,但我想知道是否有可能自动将数据插入主键列(我已经在数据库中有500行,并希望为其提供ID,但我不想手动执行) 。有什么想法吗?非常感谢。 问题答案: 在我的测试中,添加列的语句可以正常工作: 在为测试目的而创建的临时表上,以上语句创建了该 列,并为该表中的每个现有行插入了自动递增值,从1开始。

  • 表结构: 同步到数据库后: 第一次插入数据正常: 插入第二条数据就会报错: (数据: { enid: 'ddfffff', name: 'Ddfffff', index: 7, pid: null, intro: 'aaaaaaaaaaaaaaaaa' }) 大佬们看看是哪里的问题?? 第二次插入数据的时候如果添加id: 1,就能插入成功,否则失败!

  • 我们想为房间数据库构建一个过滤器,过滤器选项由用户选择。 i、 e.我们有一个带有字段(id、名称、日期、类型)的实体。用户可以按日期和/或名称过滤列表,其中包含文本和/或类型等于某个值 有办法在房间里做吗?

  • 问题内容: 我想将背景URL存储在自定义属性(CSS变量)中,并将其与background属性一起使用。但是,当使用字符串作为参数时,我找不到插值的方法。 这是我的示例代码: 我知道可以使用插值函数在Sass或LESS中轻松完成此操作,但我很好奇是否有一种无需任何预处理器的方法。 问题答案: 您可以使用大多数CSS函数执行插值,包括的示例。实际上,插值是自定义属性的主要功能之一。 但是,您不能使用