日常 - SQL 批量插入 MySQL 非自增主键

本文探讨了在MySQL中如何在一张主键非自增的表中插入数据,面对不能修改表结构和需要生成唯一ID的约束,提出了利用LAST_INSERT_ID()函数的解决方案。通过IF条件判断配合NOW()*1000或LAST_INSERT_ID()+1来确保ID的唯一性,避免冲突。
摘要由CSDN通过智能技术生成


环境

MyBatis-Plus
MySQL 5.7

前言

最近因业务需要,需要在一张主键非自增的表里使用 SQL 插入数据,表结构如下:

CREATE TABLE non_inc
(
    id BIGINT NOT NULL
        PRIMARY KEY
    -- 其他字段
);

原 id 生成策略是 MyBatis-Plus IdType::ASSIGN_ID,此时 SQL 插入数据时若不提供主键将会报错,提供的主键需要满足以下条件:

  1. 不能修改原来的表结构
  2. 数字类型
  3. 唯一且不能和未来的 id 冲突

解决方案

根据需求与约束我打开了 MySQL 的文档 Mathematical Functions 查找有关数字的函数,查看了一轮貌似可以根据 RAND()ROUND() 相组合完成 id 的生成,但是会有一个致命的弱点,生成的随机数字有可能冲突,想到这里直接放弃该方案。

要是能能添加 AUTO INC 约束就好了,我不经这么想着,既然不能添加约束,那我模拟生成不就行了?想到这马上开干,实现步骤为:

  1. 若是第一步,生成一个不会和历史与未来冲突的 id
  2. 若不是第一步,获取上一个 id + 1 当作当前 id

查阅文档 LAST_INSERT_ID() 能很好的解决我的问题,于是乎就得到了下面 SQL:

INSERT INTO non_inc(id)
SELECT IF(LAST_INSERT_ID() = 0, 
          LAST_INSERT_ID(NOW() * 1000), 
          LAST_INSERT_ID(LAST_INSERT_ID() + 1));

NON_INC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值