如何编写MySQL存储过程判断两个值是否已存在于数据表中
实现方案
原代码核心问题
你写的初始代码存在两个会导致逻辑失效的问题:
- 入参名称和表字段名称完全一致,SQL解析时会优先将条件里的标识识别为表字段,导致
TestSuiteCollectionId = TestSuiteCollectionId永远成立,存在性判断完全失效,建议给入参加p_前缀和字段做区分 - 不能直接将SELECT语句接在IF后作为判断条件,需要用
EXISTS关键字判断匹配行是否存在
修正后的存储过程代码
CREATE PROCEDURE `ChangeDashboardContent`( p_TestSuiteCollectionId varchar(45), p_Project varchar(45) ) BEGIN -- 先判断是否存在匹配行 IF NOT EXISTS ( SELECT 1 FROM dashboard_hidden WHERE TestSuiteCollectionId = p_TestSuiteCollectionId AND Project = p_Project ) THEN -- 不存在则插入数据 INSERT INTO dashboard_hidden(`TestSuiteCollectionId`,`Project`) VALUES (p_TestSuiteCollectionId, p_Project); END IF; END
更高性能的可选方案
如果你的业务允许给表加联合唯一约束,推荐用这个更简单的方案,不需要写判断逻辑,数据库底层直接处理冲突,性能比先查后插更高:
- 先给两个字段加联合唯一键:
ALTER TABLE dashboard_hidden ADD UNIQUE KEY uk_tsc_project (TestSuiteCollectionId, Project);
- 存储过程直接写INSERT IGNORE即可:
CREATE PROCEDURE `ChangeDashboardContent`( p_TestSuiteCollectionId varchar(45), p_Project varchar(45) ) BEGIN INSERT IGNORE INTO dashboard_hidden(`TestSuiteCollectionId`,`Project`) VALUES (p_TestSuiteCollectionId, p_Project); END
内容的提问来源于stack exchange,提问作者Mads Sander Høgstrup
相关产品推荐
相关产品推荐

