MySQL中,如果存在则选择,否则插入。

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);

为什么要查询 count(*)?只需查询域匹配,如果有非空结果,则返回它,否则插入数据。 - Zaffy
你是在尝试使用过程来完成这个吗? - JHS
我还在逐渐熟悉MySQL语法(所以我不会将其发布为答案),但我认为你想要的是类似于IF EXISTS (SELECT 1 FROM Domains WHERE Domain = @domain)而不是SELECT CASE WHEN (SELECT COUNT(*) FROM Domains WHERE Domain = @domain)>0 - LittleBobbyTables - Au Revoir
我尝试了if else,if exists等等,最终得到了你看到的代码,但在插入时一直出现错误。希望能得到答案,因为我对MySql一无所知。 - kms
对于其他像我一样遇到这种问题的人。因为我对MySql不是很了解,所以决定采用简单的查询插入、选择、更新和删除,并通过编程来处理逻辑。我需要向数据库发出大量请求,由于我正在使用ASP.NET,希望速度不会太慢。。 - kms
2个回答

6

您的代码缺少“End”

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

无论如何,你的else语句必须返回一个select,而不是一个insert,因为insert不会返回任何内容。 如果你想要插入一个不存在的值并返回插入的值(或者返回已经存在的值) 请按照以下方式操作:
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语法。


据我所知,如果有意义的话,CASEEND 之前也应该有一个 THEN - redej
1
MySQL不支持INTO ... WHERE吗?https://dev59.com/33RB5IYBdhLWcg3w3K4J - user1267259

1

不涉及性能和缓存的影响,如果Domain_ID是一个auto_increment字段,实现您想要的特定结果的简单方法是使用INSERT语句的ON DUPLICATE KEY子句:

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

请查看MySQL文档中的ON DUPLICATE KEY UPDATE部分的尾部。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接