MySQL Insert的同时获取自增Id
最近碰到了一个问题,就是插入数据时,同时需要用到自增Id来生成一个序列号,大概类似于【日期+9位的Id】这样,解决方案有两个:
- 使用的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
);
- 使用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);

浙公网安备 33010602011771号