【问题标题】:MySQL insert multiple rows with function with while loopMySQL使用while循环插入多行函数
【发布时间】:2019-08-08 18:06:06
【问题描述】:

我正在尝试在 MySQL 数据库中插入多行。首先,我为地址创建插入函数,它连接到另一个只包含格式化地址的表,所以我在另一个函数中为它插入。

然后在第三个函数中,我尝试使用首先为其生成虚拟地址来填充第三个表。由于某种原因,甚至第一个较低级别的函数(address_insert())由于 SQL 语法错误而无法执行,我无法弄清楚它可能是什么。有任何想法吗?

谢谢! 第一个功能:

DROP PROCEDURE IF EXISTS address_insert;
CREATE PROCEDURE address_insert()
BEGIN
DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.address) + 1;
DECLARE counter INT DEFAULT 0;

WHILE (counter < 5) DO 
INSERT INTO hoop.address (adr_id, address, city, country, created_at, lat, lng, updated_at, zip)
VALUES                   (i, CONCAT("Address-", i), "City", "United States", CURRENT_TIMESTAMP, RAND(35, 50), RAND(80, 120), CURRENT_TIMESTAMP, "ZIPCODE");

    SET i = i + 1;
    SET counter = counter + 1; 
END WHILE;
END;

第二个功能:

DROP PROCEDURE IF EXISTS address_shop_insert;
CREATE PROCEDURE address_shop_insert()
BEGIN
DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.address_shop) + 1;
DECLARE counter INT DEFAULT 0;

WHILE (counter <= SELECT COUNT(*) FROM hoop.address) DO 
INSERT INTO hoop.address_shop_insert (formatted_address, adr_id)
VALUES                               ("Formatted Address", i);

SET i = i + 1;
SET counter = counter + 1; 
END WHILE;
END;

最终功能:

DROP PROCEDURE IF EXISTS merchant_shop_insert;
CREATE PROCEDURE merchant_shop_insert()
BEGIN
address_insert()
address_shop_insert()

DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.merchant_shop) + 1; 
DECLARE merchant_accounts INT DEFAULT (SELECT COUNT(*) FROM hoop.merchant_account) + 1;
DECLARE shop_address_id DEFAULT (SELECT COUNT(*) FROM hoop.address_shop) - 5;
DECLARE counter INT DEFAULT 1;
DECLARE account_mod INT DEFAULT 0;
DECLARE account_id INT DEFAULT 1;

WHILE (i < merchant_accounts) DO
 IF 
    SELECT MOD(account_mod, 5) = 0
    SET account_id = account_id + 1;
 END IF;

 IF counter = 5
    SET shop_address_id = shop_address_id + 1;
    SET counter = 1;
 END IF;

  INSERT INTO hoop.merchant_shop (shop_id, contact_name, contact_phone, created_at, shop_name, status, updated_at, acc_id, shop_adr_id) 
  VALUES (i, "Strawberry Peach", "+361/789-6544", CURRENT_TIMESTAMP, CONCAT("Shop", i), 1, CURRENT_TIMESTAMP, account_id, shop_address_id)

  SET i = i + 1;
  SET account_mod = account_mod + 1;
  SET counter = counter + 1;
END WHILE;
END;

【问题讨论】:

    标签: mysql database function while-loop


    【解决方案1】:

    由于半列;结束了一个命令,你需要为存储过程的创建定义一个特定的,否则,MySQL将不知道告诉过程声明结束的分隔符是什么。

    DROP PROCEDURE IF EXISTS address_insert;    
    
    -- Set the delimiter to $$
    DELIMITER $$
    
    -- Notice that every instructions IN the procedure will be ended by the regular delimiter ;
    CREATE PROCEDURE address_insert()
    BEGIN
        DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.address) + 1;
        DECLARE counter INT DEFAULT 0;
    
        WHILE (counter < 5) DO 
            INSERT INTO hoop.address (adr_id, address, city, country, created_at, lat, lng, updated_at, zip)
            VALUES                   (i, CONCAT("Address-", i), "City", "United States", CURRENT_TIMESTAMP, RAND(35, 50), RAND(80, 120), CURRENT_TIMESTAMP, "ZIPCODE");
    
            SET i = i + 1;
            SET counter = counter + 1; 
        END WHILE;
    -- vv------------------------ Notice this
    END$$
    
    -- Set it back to ;
    DELIMITER ;
    

    【讨论】:

    • 谢谢你,很遗憾它并没有解决语法错误。
    猜你喜欢
    • 2015-01-14
    • 2016-02-29
    • 2022-01-07
    • 2012-04-23
    • 2019-01-21
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多