我想将1000个唯一的随机值添加到表代理的列AgentID中。
我已经使用Upsert来忽略重复的值。我到目前为止所做的事:
DROP PROCEDURE IF EXISTS Generate_random;
DELIMITER $$
CREATE PROCEDURE Generate_random()
BEGIN
Drop table if exists ai_training.`Agents`;
CREATE TABLE ai_training.`Agents`(AgentID int PRIMARY KEY);
SET @first = 1;
SET @last = 1000;
WHILE(@first <= @last) Do
INSERT INTO ai_training.`Agents` VALUES(
FLOOR(RAND()*(2900000-2800000+1)+2800000)
)
ON DUPLICATE KEY UPDATE AgentID = FLOOR(RAND()*(2900000-2800000+1)+2800000);
SET @first = @first + 1;
END WHILE;
END$$
DELIMITER ;
CALL Generate_random();
Select * from ai_training.`Agents`;问题是我需要1000个唯一的代理程序,这个代码生成1000个重复的代理程序。因此,如果找到6个重复if,则返回994行,而不是1000行。
我有办法做到这一点吗?无法更改随机ID生成部分。
发布于 2020-12-28 11:53:54
您可以使用ROW_COUNT()检查一行是否实际插入,并相应地增加计数器。
The 文献状态
使用
ON DUPLICATE KEY UPDATE,如果将行插入为新行,则每行受影响的行值为1;如果更新现有行,则为2;如果将现有行设置为其当前值,则为0。
所以:
WHILE(@first <= @last) DO
INSERT INTO ai_training.`Agents`
VALUES(FLOOR(RAND()*(2900000-2800000+1)+2800000))
ON DUPLICATE KEY UPDATE AgentID = AgentID;
IF ROW_COUNT() = 1 THEN
SET @first = @first + 1;
END IF;
END WHILE;请注意,我将重复键上的操作更改为一个虚拟更新,而不是重新分配一个新的随机值;这使碰撞发生时的开销有所降低。
发布于 2020-12-28 11:53:28
CREATE PROCEDURE Generate_random()
BEGIN
Drop table if exists ai_training.`Agents`;
CREATE TABLE ai_training.`Agents`(AgentID int PRIMARY KEY);
SET @last = 1000;
WHILE (SELECT COUNT(*) FROM ai_training.`Agents`) < @last DO
INSERT IGNORE INTO ai_training.`Agents`
VALUES
(FLOOR(RAND()*(2900000-2800000+1)+2800000));
END WHILE;
ENDhttps://stackoverflow.com/questions/65477105
复制相似问题