为啥这个 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 语句不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

freemarker size判空 为啥出现这个错误

为啥我不应该在访问对象之前使用“if Assigned()”?

为啥这个 NIB 视图在返回之前没有发布?

为啥这个递归会崩溃?

为啥这个友元函数不能访问私有变量?

为啥这个方法打印出 347 而不是 3?