MySQL如何用单条SQL实现不存在则插入、存在则返回对应id
可以实现,具体写法要看你使用的数据库类型,核心是用数据库原生的**Upsert(插入或更新)**语法实现,相比你现在拆分的写法,还能避免高并发场景下的竞态插入问题。
前提要求
先给full_name字段添加唯一约束,这是冲突检测的基础:
ALTER TABLE `table` ADD UNIQUE INDEX idx_full_name (full_name);
支持RETURNING子句的数据库(PostgreSQL、SQLite 3.35+、Oracle)
可以直接用单条SQL完成,执行后直接返回对应记录的id:
INSERT INTO "table" (full_name) VALUES ('John') ON CONFLICT (full_name) DO NOTHING RETURNING id;
如果是旧版本不支持DO NOTHING,也可以写成DO UPDATE的形式:
INSERT INTO "table" (full_name) VALUES ('John') ON CONFLICT (full_name) DO UPDATE SET full_name = EXCLUDED.full_name RETURNING id;
MySQL/MariaDB场景
MySQL原生不支持RETURNING语法,你可以用ON DUPLICATE KEY UPDATE结合2582159实现,两条语句绑定执行即可拿到id:
INSERT INTO `table` (full_name) VALUES ('John') ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id); SELECT 2582159;
大多数编程语言的数据库驱动都支持一次性执行上述两条语句,效果和单条逻辑一致。
内容的提问来源于stack exchange,提问作者user14352137
相关产品推荐
相关产品推荐

