【问题标题】:ERROR 1064: Cannot execute while loop in mysql using variables错误 1064:无法使用变量在 mysql 中执行 while 循环
【发布时间】:2019-11-06 23:21:02
【问题描述】:

我想运行以下查询以循环插入表中:

SET @maxid =  ( select max( length( id ) ) from article ) ;
SET @x=1;
WHILE @x<= @maxid DO
 INSERT INTO `article_responder` 
   (article_id, username, reply_id)
   SELECT @x, p.username, p.id
   FROM article AS a, post AS p
   WHERE a.id=@x AND p.article_id=@x ;
 SET  @x = @x + 1; 
 END WHILE;

但我收到此错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END WHILE' at line 

注意article_id不能自增,因为业务登录要求插入数据后article_responder的下一行可以是关于任何文章的。所以我不知道如何用通常的连接填充article_responder

我该如何解决?

【问题讨论】:

  • 在 mysql 中,您只能在存储的程序中编写 while 循环。(过程、函数、触发器、事件)
  • @P.Salmon 那么你将如何以非循环格式重写上面的 sn-p 呢?
  • 介意描述一下它应该做什么?
  • 当然。它应该从articlepost 获取字段并将它们插入article_responder,并使用循环中描述的登录名。查询应该遍历所有文章行。
  • 我对 article_id 在其中的角色感到困惑。样本数据将有助于澄清,

标签: mysql while-loop


【解决方案1】:

我建议将article_id 设为主键自动递增列,然后执行以下INSERT INTO ... SELECT

INSERT INTO article_responder (username, reply_id)
SELECT p.username, p.id
FROM post p
INNER JOIN article a
    ON a.id = p.article_id;

注意WHERE a.id=@x AND p.article_id=@x的逻辑相当于说a.id = p.article_id

【讨论】:

  • 好吧,业务逻辑不允许 article_id 自动递增。它应该允许任何article_id 出现。
  • 那么也许您应该编辑您的问题并解释该业务逻辑,因为我觉得这是一个不寻常的要求。
  • 您并没有真正解释需求,您只是再次声明。
  • 对不起,如果我不清楚。重点是:我有一个包含其 cmets 的现有博客。现在我想添加一个新的 blog_responder 表来保存对每个博客发表评论的人的姓名,以便可以在该博客下方列出这些姓名。博客 ID 不是自动递增的,因为其中一些已被删除。
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多