MySQL Insert的同时获取自增Id

最近碰到了一个问题,就是插入数据时,同时需要用到自增Id来生成一个序列号,大概类似于【日期+9位的Id】这样,解决方案有两个:

  1. 使用的Mysql版本大于5.7,可以使用生成列
CREATE TABLE DemoTable (
    Id INT AUTO_INCREMENT PRIMARY KEY,
    CreateTime DATETIME DEFAULT CURRENT_TIMESTAMP,
    SerialNo VARCHAR(20) AS (CONCAT(DATE_FORMAT(CreateTime, '%Y%m%d'), Id)) STORED
);
  1. 使用LAST_INSERT_ID
    这个函数是用来获取当前连接最后插入的自增ID,是线程安全的,不会受其他事物影响,使用大概类似于下面这样:
var sql = @"
    INSERT INTO DemoTable (CreateTime) 
    VALUES (@CreateTime);
    
    -- 获取刚插入的 Id 并更新 SerialNo
    UPDATE DemoTable 
    SET SerialNo = CONCAT(DATE_FORMAT(CreateTime, '%Y%m%d'), LPAD(LAST_INSERT_ID(), 9, '0'))
    WHERE Id = LAST_INSERT_ID();";

connection.Execute(sql, new { CreateTime = DateTime.Now });

若存在则更新

这里说的问题,和上诉案例无关,我只是懒得再新建一个文章了,需要做一个MySQL操作,数据存在则更新,可以用 UNIQUE 约束(主键或唯一索引)都会触发 ON DUPLICATE KEY UPDATE。

INSERT INTO users (email, name)
VALUES ('test@example.com', 'Alice')
ON DUPLICATE KEY UPDATE name = VALUES(name);
posted @ 2025-04-10 10:56  破落户儿  阅读(53)  评论(0)    收藏  举报