为啥这个 IF NOT EXISTS 语句不起作用?
Posted
技术标签:
【中文标题】为啥这个 IF NOT EXISTS 语句不起作用?【英文标题】:Why doesn't this IF NOT EXISTS statement work?为什么这个 IF NOT EXISTS 语句不起作用? 【发布时间】:2013-03-18 12:27:29 【问题描述】:我正在尝试编写一个查询,该查询会将 0 到 9999 之间的随机值插入到表中,而该随机值尚不存在。 但是,我写的任何东西都不起作用。似乎 WHERE 子句不适用于 INSERT,并且我的 SQL 服务器无法执行 IF NOT EXISTS 查询。不正确,我想知道吗? 我该怎么办?我的问题有解决方案吗? (我用的是 mysql)
SET @rand = ROUND(RAND() * 9999);
IF NOT EXISTS (SELECT `num` FROM `nums` WHERE `num` = @rand)
INSERT INTO `nums` (`num`) VALUES (@rand);
【问题讨论】:
MySQL 还是 Oracle?它们完全不同。 这样的 IF 语句只适用于 TSQL 和 PL/SQL 之类的东西。如果你只是在执行一个查询,那是行不通的。您必须将该逻辑放入执行代码中。 我该怎么做?我正在使用与当前版本的 WampServer 和 XAMPP 一起使用的 MySQL 版本。 【参考方案1】:你可以在这里做:MySQL: Insert record if not exists in table
INSERT INTO `nums` (`num`)
SELECT *
FROM
(SELECT @rand) AS q
WHERE NOT EXISTS
(SELECT `num`
FROM `nums`
WHERE `num` = @rand);
【讨论】:
【参考方案2】:尝试使用这样的存储过程:
CREATE PROCEDURE my_sp()
BEGIN
SET @rand = ROUND(RAND() * 9999);
IF NOT EXISTS (SELECT `num` FROM `nums` WHERE `num` = @rand) THEN
INSERT INTO `nums` (`num`) VALUES (@rand);
END IF;
END
【讨论】:
【参考方案3】:使用IF
之类的语句属于存储过程之类的代码块。您将无法仅在 mysql 提示符下执行它。
如果你只是想插入一个之前不存在的随机值,你也可以通过
mysql> 创建表 nums(num int, unique key(num)); 查询正常,0 行受影响(0.05 秒) mysql> 将忽略插入 nums >select round(rand()*9999);> 查询正常,1 行受影响 (0.01 >sec)> 记录:1 重复:0 警告>:0> mysql> 将忽略插入 nums select round(rand()*9999); 查询正常,1 行受影响(0.00 秒) 记录:1 重复:0 警告:0 mysql> 将忽略插入 nums select round(rand()*9999); 查询正常,1 行受影响(0.00 秒) 记录:1 重复:0 警告:0 mysql> 将忽略插入 nums select round(rand()*9999); 查询正常,1 行受影响(0.00 秒) 记录:1 重复:0 警告:0 mysql> 从 nums 中选择 *; +------+ |编号 | +------+ | 5268 | | 9075 | | 9114 | | 9768 | +------+ 4 行一组(0.00 秒) mysql>使用insert ignore
,如果已经存在则不会插入行。
【讨论】:
以上是关于为啥这个 IF NOT EXISTS 语句不起作用?的主要内容,如果未能解决你的问题,请参考以下文章