【问题标题】:MySQL while loop insertMySQL while 循环插入
【发布时间】: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');

我正在努力实现的目标

  1. 向 sp 提供 5 个随机令牌
  2. 插入第一个可用的令牌(即 test_table 中不存在)
  3. 使用插入的令牌更新记录的其余部分并返回该记录

这是症状

  1. 第一次调用sp_test,没问题,sp 返回了|测试1 |快乐 |
  2. 第二次调用sp_test,没有错误但sp什么也没返回; test2 已插入,但 val1 未更新,即 |测试2 |空|
  3. 第三次调用 sp_test 崩溃了

错误代码:1062。键“PRIMARY”的重复条目“test2”

while 循环确实移动到令牌 test2 并将其插入到 test_table 但没有进一步,在 test2 之后更新也失败了。 存储过程非常简单,我不知道为什么会这样。有什么想法吗?

【问题讨论】:

  • XY 问题。发布任务本身。还要告诉什么是精确的 MySQL 版本。

标签: mysql do-while insert-update


【解决方案1】:
  1. 在您的 SP 中有一行
UPDATE test_table SET val1 = val1 WHERE token = tokenUsed;

其中的val1 都是在SP 参数中定义的局部变量。 token 也是如此。必须是

UPDATE test_table SET test_table.val1 = val1 WHERE test_table.token = tokenUsed;

同时检查您的代码是否存在其他语句中的相同问题。

  1. 调查您的 SP 流程,例如:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=d31de2054cc4077ceb26d2cf2da588ab

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 2021-06-03
    • 1970-01-01
    • 2016-02-29
    • 2019-08-08
    • 2012-04-23
    • 2019-01-21
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多