【问题标题】:Mysql while loop is not working (Returning a 1064)Mysql while 循环不工作(返回 1064)
【发布时间】:2019-06-06 09:43:03
【问题描述】:

我正在尝试对数据库进行多次插入。我需要使用一个循环,因为在 Node.js 中,我正在定义我应该添加多少行。因此,我不能在Insert Into 上使用Values(...), (...) 语法。

但是,当我使用此循环时,我收到错误 1064。我该怎么办?

DELIMITER //
DROP PROCEDURE IF EXISTS addReservations;
CREATE PROCEDURE addReservations()

BEGIN
  DECLARE v1 INT DEFAULT 0;
  WHILE v1 < 5 DO
    INSERT INTO `Reservations` (`Timeslot_idTimeslot`, `Exam_type_idExam_type`, `Temp_Student_idStudent`, `Lock_expiration_date`)
    VALUES (1, 1, 1, '2019-07-02 00:00:00');
    SET v1 = v1 + 1;
  END WHILE;
END;
DELIMITER;

我收到的错误是:

错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“DELIMITER”附近使用正确的语法

【问题讨论】:

标签: mysql mysql-error-1064


【解决方案1】:

尝试如下调整分隔符 [;;]。 如果它不起作用,请尝试分隔符 [$$]。

DROP PROCEDURE IF EXISTS addReservations;
DELIMITER ;;
CREATE PROCEDURE addReservations()
BEGIN
  DECLARE v1 INT DEFAULT 0;
  WHILE v1 < 5 DO
    INSERT INTO `Reservations` (`Timeslot_idTimeslot`, `Exam_type_idExam_type`,    `Temp_Student_idStudent`, `Lock_expiration_date`)
    VALUES (1, 1, 1, '2019-07-02 00:00:00');
    SET v1 = v1 + 1;
  END WHILE;
END;;
DELIMITER;

如果它仍然不起作用,我建议您将 PROCEDURE 精简到最少的代码,以确保它实际上是导致问题的根本原因的分隔符,例如:

DROP PROCEDURE IF EXISTS addReservations;
DELIMITER ;;
CREATE PROCEDURE addReservations()
BEGIN
  SELECT * FROM ["comment: add your table name here"];
END
;;
DELIMITER ;

此外,如果您希望您的存储过程实际执行,则需要使用命令 [CALL] 调用它。请注意,调用应该在 PROCEDURE 之外进行。只有这样您才能看到要执行的查询,因此更改在您的数据库中可见。

【讨论】:

  • Mysql Workbench 告诉我最后一行 (DELIMITER;) 在该位置无效。
  • 最后一行只是将分隔符重置为默认的[;]。
  • 我根据您的问题更新了答案。尝试做一些应该更新你的数据库的最低限度的事情,比如插入一行。确保您使用 [call] 来执行 PROCEDURE。
  • 成功了!谢谢你。有没有办法使用循环而不必声明过程并调用它?我只想使用循环,就是这样......
  • 当然,您应该将 STORED PROCEDURE 视为直接在 db 中存储结构(例如 mysql 查询)的一种方式。好处是,如果您构建一个 webfront,您将在代码中添加您的 STORED PROCEDURE,这会在您的脚本和您的数据库之间创建 API 的相似性。但是,要发送您的查询,您不需要使用存储过程,只需将您的数据库查询添加到 *.sql 文件中并从您的 php 文件中调用它。
猜你喜欢
  • 2016-11-30
  • 1970-01-01
  • 2011-05-25
  • 2021-02-01
  • 1970-01-01
  • 2015-11-17
  • 2016-01-11
  • 2013-06-07
相关资源
最近更新 更多