【问题标题】:mysql - insert/update string values without wrapping quotesmysql - 插入/更新字符串值而不用引号引起来
【发布时间】:2021-05-24 23:50:38
【问题描述】:

我创建了一个循环遍历表并将结果连接到变量中的例程。该变量稍后与 PREPARE 和 EXECUTE 一起使用,一次性插入一堆行。

BEGIN

    DECLARE fetched_name VARCHAR(32);

    DECLARE loop_finished TINYINT(1) UNSIGNED DEFAULT 0;
    DECLARE loop_cursor CURSOR FOR SELECT name FROM first_example_table;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_finished = 1;

    SET @insert_entry = NULL;

        OPEN loop_cursor;

            looping: LOOP

                FETCH loop_cursor INTO fetched_name;
    
                    IF
                    loop_finished = 1
                    THEN
    
                        LEAVE looping;
    
                    END IF;
    
                SET @insert_list = CONCAT_WS("), (", @insert_list, fetched_name);

            END LOOP;

        CLOSE loop_cursor;

    SET @insert_list = CONCAT("INSERT INTO second_example_temple (name) VALUES (", @insert_list, ")");

    PREPARE insert_query FROM @insert_list;
    EXECUTE insert_query;

END

到目前为止,这实际上可以按预期工作。但是,问题是准备好的查询包含不带引号的值,如下所示:

INSERT INTO second_example_temple (name) VALUES (Bill), (Peter), (Tom);

MySQL 拒绝对缺少引号的查询,它希望查询看起来像这样:

INSERT INTO second_example_temple (name) VALUES ("Bill"), ("Peter"), ("Tom");

对于这个问题有什么好的解决方法吗?理想情况下手动设置引号并且使用 CONCAT 或 CONCAT_WS,因为在名称旁边设置更多字段时会变得非常复杂。

【问题讨论】:

    标签: mysql loops cursor quotes declare


    【解决方案1】:

    您可以像示例中一样使用 QUOTE。

    即使是数字,MySQL 也不介意引号,但必须输入不带引号的 NULL

    CREATE TABLE employees (email varchar(19))
    
    INSERT INTO employees VALUES ('test@test.de'),('test2@test.de'),('test1@test.de')
    
    CREATE PROCEDURE createEmailList (
      INOUT emailList varchar(4000)
    )
    BEGIN
      DECLARE finished INTEGER DEFAULT 0;
      DECLARE emailAddress varchar(100) DEFAULT "";
    
      -- declare cursor for employee email
      DEClARE curEmail 
          CURSOR FOR 
              SELECT email FROM employees;
    
      -- declare NOT FOUND handler
      DECLARE CONTINUE HANDLER 
            FOR NOT FOUND SET finished = 1;
    SET emailList = '';
      OPEN curEmail;
    
      getEmail: LOOP
          FETCH curEmail INTO emailAddress;
          SET @a = emailAddress;
          IF finished = 1 THEN 
              LEAVE getEmail;
          END IF;
          -- build email list
          SET emailList = CONCAT(QUOTE(emailAddress),";",emailList);
          SET @b = CONCAT(QUOTE(emailAddress),';',emailList);
      END LOOP getEmail;
      CLOSE curEmail;
    
    END
    
    CALL createEmailList(@emaillist)
    
    SELECT @emaillist
    
    | @电子邮件列表 | | :------------------------------------------------------------ | | 'test1@test.de';'test2@test.de';'test@test.de'; |

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多