使用ON CONFLICT DO NOTHING时如何返回成功插入的非重复行?
如何返回INSERT...ON CONFLICT DO NOTHING中成功插入的非重复行
直接在INSERT语句末尾加上RETURNING子句(指定需要返回的列或用*返回全部列),就能快速获取实际成功插入的非重复行,这是最直接高效的方式。
示例代码:
INSERT INTO mytable (id, col1, col2) VALUES (123, 'some_value', 'some_other_value'), (456, 'new_val', 'another_new_val'), (123, 'some_value', 'some_other_value') -- 该行因冲突被跳过,不会插入 ON CONFLICT (id, col1, col2) DO NOTHING RETURNING id, col1, col2; -- 仅返回第二条成功插入的行
原理很明确:RETURNING会捕获INSERT操作中实际写入表的行数据,那些触发冲突被DO NOTHING忽略的行不会出现在返回结果里。
如果需要统计成功插入的行数,还可以结合CTE来实现:
WITH inserted_rows AS ( INSERT INTO mytable (id, col1, col2) VALUES (...) ON CONFLICT (id, col1, col2) DO NOTHING RETURNING * ) SELECT COUNT(*) AS inserted_count FROM inserted_rows;
内容的提问来源于stack exchange,提问作者user1361488
相关产品推荐
相关产品推荐

