如何用其他表值与整数执行INSERT INTO?遇唯一键约束求解决
解决INSERT语句触发主键/唯一键约束错误的方案
首先咱们得揪出问题的根源:你遇到的约束冲突,大概率是因为要插入的(NO_PATIENT, NO_CARACTE)组合已经存在于PAT_CARAC表中了——毕竟你把NO_CARACTE固定设为'16',而原语句里又用INNER JOIN关联了PAT_CARAC,这相当于只筛选已经有特征记录的患者,自然会触发重复插入的冲突。
下面给你几个针对性的解决办法:
1. 只插入不存在的目标记录(最贴合常规需求)
如果你的需求是给还没有16号特征的患者新增这条记录,可以修改SQL,用NOT EXISTS过滤掉已存在的组合,同时去掉多余的INNER JOIN:
INSERT INTO PAT_CARAC (NO_PATIENT, NO_CARACTE, DATEEXPIRA) SELECT pp.NO_PATIENT, '16', NULL FROM PAT_PATIENT pp WHERE pp.NO_CLINIQUE = 2 AND NOT EXISTS ( SELECT 1 FROM PAT_CARAC pc WHERE pc.NO_PATIENT = pp.NO_PATIENT AND pc.NO_CARACTE = '16' );
2. 替换已存在的记录(需要更新旧数据时用)
如果你的需求是不管记录是否存在,都要把该患者的16号特征的DATEEXPIRA设为NULL,可以用数据库对应的“插入或更新”语法:
MySQL 版本:
INSERT INTO PAT_CARAC (NO_PATIENT, NO_CARACTE, DATEEXPIRA) SELECT pp.NO_PATIENT, '16', NULL FROM PAT_PATIENT pp WHERE pp.NO_CLINIQUE = 2 ON DUPLICATE KEY UPDATE DATEEXPIRA = NULL;
Oracle/SQL Server 版本(用MERGE语法):
MERGE INTO PAT_CARAC pc USING ( SELECT NO_PATIENT FROM PAT_PATIENT WHERE NO_CLINIQUE = 2 ) pp ON (pc.NO_PATIENT = pp.NO_PATIENT AND pc.NO_CARACTE = '16') WHEN NOT MATCHED THEN INSERT (NO_PATIENT, NO_CARACTE, DATEEXPIRA) VALUES (pp.NO_PATIENT, '16', NULL) WHEN MATCHED THEN UPDATE SET DATEEXPIRA = NULL;
3. 先排查冲突记录(确认问题时用)
如果你想先明确哪些患者已经有了16号特征记录,可以运行这条查询:
SELECT pp.NO_PATIENT FROM PAT_PATIENT pp INNER JOIN PAT_CARAC pc ON pp.NO_PATIENT = pc.NO_PATIENT WHERE pp.NO_CLINIQUE = 2 AND pc.NO_CARACTE = '16';
结果里的患者ID就是导致冲突的源头,你可以根据实际情况决定是删除旧记录,还是调整插入逻辑。
内容的提问来源于stack exchange,提问作者jdrew619
相关产品推荐
相关产品推荐

