4

我已经为此痛苦了两个小时。我想选择或插入一条记录。如果记录存在,则选择他的 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);
4

2 回答 2

6

您的案例缺少 End

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

无论如何,你的 else 必须返回一个选择,一个插入不会返回任何东西。如果要插入(如果不存在)然后返回插入的值(或返回如果存在),请执行以下操作:

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语法

于 2012-10-01T15:33:40.507 回答
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 文档的结尾部分。

于 2013-12-18T15:08:58.597 回答