MySql IF 存在选择 ELSE 插入
Posted
技术标签:
【中文标题】MySql IF 存在选择 ELSE 插入【英文标题】:MySql IF exists select ELSE insert 【发布时间】:2012-10-01 15:30:18 【问题描述】:我已经为此痛苦了两个小时。我想选择或插入一条记录。如果记录存在,则选择他的 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(*) ?只查询域匹配,如果有非空结果,则返回,否则插入数据。 您是否尝试在程序中执行此操作? 我仍然掌握 mysql 语法的窍门(所以我不会将其作为答案发布),但我相信您想要类似于IF EXISTS (SELECT 1 FROM Domains WHERE Domain = @domain)
... 而不是 @ 987654323@
我确实尝试过 if else, if exists 和类似的东西。我最终得到了你看到的代码,但我在插入时不断收到错误。我希望我能得到答案,因为我对MySql一无所知
对于其他遭受此类痛苦的人。因为我不太了解 MySql,所以我决定使用简单的查询插入、选择、更新、删除并以编程方式执行我的逻辑。我需要向数据库发出很多请求,因为我使用的是 ASP.NET,所以我希望它不会太慢..
【参考方案1】:
你的案子没有结束
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
语法
【讨论】:
MySQL 不支持INTO ... WHERE
? ***.com/questions/485039/mysql-insert-where-query【参考方案2】:
不考虑对性能和缓存的影响,如果 Domain_ID 是 auto_increment
字段,实现您想要的特定结果的简单方法是使用 INSERT
语句的 ON DUPLICATE KEY
子句:
INSERT INTO Domains
(fld1, fld2, fld3)
VALUES(....)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
见ON DUPLICATE KEY UPDATE
MySQL documentation的尾部。
【讨论】:
以上是关于MySql IF 存在选择 ELSE 插入的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 当记录不存在时插入(insert if not exists)
MySQL 当记录不存在时插入(insert if not exists)