【发布时间】:2022-01-07 17:27:11
【问题描述】:
我在 MySQL 上的 while 循环插入遇到了一个非常奇怪的问题
这是我测试的背景信息:
CREATE TABLE test_table (
`token` varchar(16) NOT NULL,
`val1` varchar(256) DEFAULT NULL,
PRIMARY KEY (`token`)
);
DELIMITER $$
CREATE PROCEDURE sp_test(
IN token VARCHAR(16),
IN token1 VARCHAR(16),
IN token2 VARCHAR(16),
IN token3 VARCHAR(16),
IN token4 VARCHAR(16),
IN val1 VARCHAR(256)
)
BEGIN
DECLARE tokenUsed VARCHAR(16);
DECLARE trial INT DEFAULT 0;
DECLARE tmpTok VARCHAR(16);
WHILE (tokenUsed IS NULL AND trial < 5)
DO
SET tmpTok = CASE trial WHEN 0 THEN token WHEN 1 THEN token1 WHEN 2 THEN token2
WHEN 3 THEN token3 WHEN 4 THEN token4 END;
IF NOT EXISTS(SELECT 1 FROM test_table WHERE token = tmpTok)
THEN
SET tokenUsed = tmpTok;
INSERT INTO test_table (token) VALUES(tmpTok);
END IF;
SET trial = trial + 1;
END WHILE;
IF tokenUsed IS NOT NULL
THEN
UPDATE test_table SET val1 = val1 WHERE token = tokenUsed;
END IF;
SELECT * FROM test_table WHERE token = tokenUsed;
END$$
DELIMITER ;
然后我会像这样调用存储的 proc servral 时间
CALL sp_test ('test1', 'test2', 'test3', 'test4', 'test5', 'happy');
我正在努力实现的目标
- 向 sp 提供 5 个随机令牌
- 插入第一个可用的令牌(即 test_table 中不存在)
- 使用插入的令牌更新记录的其余部分并返回该记录
这是症状
- 第一次调用sp_test,没问题,sp 返回了|测试1 |快乐 |
- 第二次调用sp_test,没有错误但sp什么也没返回; test2 已插入,但 val1 未更新,即 |测试2 |空|
- 第三次调用 sp_test 崩溃了
错误代码:1062。键“PRIMARY”的重复条目“test2”
while 循环确实移动到令牌 test2 并将其插入到 test_table 但没有进一步,在 test2 之后更新也失败了。 存储过程非常简单,我不知道为什么会这样。有什么想法吗?
【问题讨论】:
-
XY 问题。发布任务本身。还要告诉什么是精确的 MySQL 版本。
标签: mysql do-while insert-update