MySql IF存在select ELSE insert

时间:2012-10-01 15:30:18

标签: mysql sql stored-procedures

我现在已经忍受了两个小时了。我想选择或插入一条记录。如果记录存在,请选择其他ID,然后插入并获取新插入的ID。现在我正试图运行它,但我仍然收到错误

SELECT CASE WHEN (SELECT COUNT(*) FROM Domains WHERE Domain = @domain)>0 
THEN 
    (SELECT Domain_ID FROM Domains WHERE Domain = @domain) 
ELSE        
    INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID,@Domain,@Disabled,@Description);

3 个答案:

答案 0 :(得分:6)

您的案例缺少结束

Case when (something) then (Some)
else (another thing) end

无论如何,你的其他人必须返回一个选择,插入不会返回任何内容。 如果你想插入如果不存在然后返回插入的值(或返回,如果存在) 这样做:

INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID,@Domain,@Disabled,@Description) where not exists (select 1 from Domains WHERE Domain = @domain);

SELECT Domain_ID FROM Domains WHERE Domain = @domain

如果不存在则插入,然后返回。如果已经存在,则不会插入,并返回值

2016年1月编辑

最后一个查询不适用于MySql,它是MSSQL语法

答案 1 :(得分:1)

如果没有对性能和缓存产生影响,如果Domain_ID是auto_increment字段,那么实现所需特定结果的简单方法是使用ON DUPLICATE KEY INSERT子句声明:

INSERT INTO Domains
    (fld1, fld2, fld3)
    VALUES(....)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);

请参阅ON DUPLICATE KEY UPDATE MySQL documentation的尾部。

答案 2 :(得分:-1)

我看不到

If Not Exists(Select DomainId From Domains Where Domain = @domain)
Begin
  INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID, @Domain, @Disabled, @Description);     
End
Select @DomainID

看来你似乎正在传递它,事实上我不明白为什么你需要它从查询中回来?