【问题标题】:Mysql procedure does not execute as expectedMysql 过程未按预期执行
【发布时间】:2019-06-27 15:10:54
【问题描述】:

使用mysql 5.7,当我执行这个程序时:

DELIMITER $$
CREATE PROCEDURE tres()
BEGIN
    DECLARE maxid INT;
    DECLARE x INT;
    SET maxid = 655;
    SET x=1;
    WHILE x<= maxid DO 
        INSERT INTO `forum_topicresponder` (topic_id, username, reply_id) SELECT p.topic_id, p.creator_name, p.id  FROM forum_post AS p  WHERE p.topic_id=x;
     SET  x = x + 1; 
     END WHILE;
END$$

我明白了

mysql> 调用 tres();
查询正常,0 行受影响(3.49 秒)

但是,当我对循环范围内的某些值执行 INSERT 时:

 INSERT INTO `forum_topicresponder` (topic_id, username, reply_id) SELECT p.topic_id, p.creator_name, p.id  FROM forum_post AS p  WHERE p.topic_id=42;

我看到结果插入没有问题。

表架构:

CREATE TABLE `forum_topicresponder` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `topic_id` int(10) NOT NULL DEFAULT '0',
  `username` varchar(300) CHARACTER SET utf8mb4 NOT NULL DEFAULT 'na',
  `reply_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=latin1;

CREATE TABLE `forum_post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `body` varchar(16000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `topic_id` int(11) NOT NULL DEFAULT '0',
  `creator_id` int(11) NOT NULL DEFAULT '0',
  `creator_name` varchar(30) NOT NULL DEFAULT 'NA',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6264595 DEFAULT CHARSET=utf8;

那么这里可能出了什么问题,我该如何解决?

【问题讨论】:

  • 不清楚。您期望什么以及会发生什么?
  • 我希望循环遍历所有topic_ids,获取每个相关响应者并将它们插入forum_topicresponder。正如单个插入查询所做的那样。
  • 测试它工作正常..它将所有记录从forum_post复制到forum_topicresponder..然后出了什么问题..?
  • 感谢测试。然而不同的是,我的forum_post 没有reply_id 字段。我已经添加了架构。请再看一遍。

标签: mysql sql


【解决方案1】:

您需要检查程序中x的值,它可能与forum_post表的topic_id不匹配。

如果 topic_id 不匹配,则不会将任何数据复制到 forum_topicresponder 表中。

你需要设置合适的x值,(从min到max)取决于forum_post表的topic_id

【讨论】:

    【解决方案2】:

    您为什么要为此使用循环?做吧:

     INSERT INTO `forum_topicresponder` (topic_id, username, reply_id)
         SELECT p.topic_id, p.creator_name, p.id
         FROM forum_post p
         WHERE p.topic_id <= 665;  -- or use a variable if you prefer
    

    【讨论】:

    • 我使用循环,因为 topic_ids 没有增加。它们分散在一个范围之间。此外,当我尝试您的查询时,我得到Query OK, 0 rows affected (0.00 sec)
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 2013-08-20
    • 2017-12-15
    • 2011-02-25
    • 2012-11-23
    • 2014-10-20
    • 2015-09-17
    • 2015-07-22
    相关资源
    最近更新 更多