1

我正在尝试编写一个查询,该查询会将 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);
4

3 回答 3

1

你可以在这里这样做:MySQL:如果表中不存在则插入记录

INSERT INTO `nums` (`num`)
SELECT *
FROM
  (SELECT @rand) AS q
WHERE NOT EXISTS
    (SELECT `num`
     FROM `nums`
     WHERE `num` = @rand);
于 2013-03-18T17:53:44.677 回答
0

尝试使用这样的存储过程:

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
于 2013-03-18T13:49:19.400 回答
0

使用类似的语句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,如果它已经存在,它将不会插入一行。

于 2013-03-18T17:42:38.053 回答