【问题标题】: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 版本。

标签: mysql sql if-statement exists


【解决方案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,如果已经存在则不会插入行。

      【讨论】:

        猜你喜欢
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多