Mysql процедура не выполняется должным образом - PullRequest
0 голосов
/ 26 июня 2019

Используя 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> call 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;

Так что здесь может быть не так и как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Вам необходимо проверить значение x в процедуре, оно может не совпадать с вашим topic_id таблицы forum_post.

Если topic_id не совпадает, то никакие данные не будут скопированы в таблицу forum_topicresponder.

Вам необходимо установить правильное значение x, (от минимального до максимального), зависит от topic_id таблицы forum_post

0 голосов
/ 26 июня 2019

Зачем вам использовать цикл для этого?Просто сделай:

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...