【问题标题】:Creating stored procedure for multiple insert and alter table queries为多个插入和更改表查询创建存储过程
【发布时间】:2016-03-25 12:23:30
【问题描述】:
$link->query("DROP TABLE IF EXISTS table2");           
$link->query("CREATE TABLE table2 (newcol BIGINT UNSIGNED  PRIMARY KEY)");
$result=$link->query("select col1 from table1");
while($data=$result->fetch_array(MYSQL_ASSOC))
{

    $link->query("insert into table2 (newcol) values($data['col1']);
    $link->query(""ALTER TABLE table2 ADD  `".$data['col1']."` BIGINT DEFAULT 0"");
  }

我想做的是

  1. 创建一个表“table2”,其中有一列“newcol”。
  2. 从“table1”中选择“col1”的所有值并
  3. 对于来自table1col1 的每个值

    -将值插入table2的“newcol”和

    -将一列namedvalue from col1 of table 1)添加到“table2”中

上面的代码在php中看起来非常简洁高效,但问题是它需要一些时间。所以我认为最好将它们转换为MySQL存储过程。由于我是存储过程的新手,非常困惑.请帮帮我。

【问题讨论】:

  • 表和字段是否始终相同,或者您打算将这些值作为输入传递到存储过程中?

标签: php mysql stored-procedures


【解决方案1】:

当然,我无法测试它,但它在我的计算机上编译正常。

DELIMITER //

CREATE PROCEDURE `myProcedure` ()
BEGIN

    DECLARE _done BOOLEAN DEFAULT FALSE;
    DECLARE _myField BIGINT UNSIGNED DEFAULT 0;

    /* the cursor here is like your PDOStatement 
    * it is used to fetch data */
    DEClARE _myReader CURSOR FOR
        SELECT `col1` FROM `table1`;

    /* it is not very elegant, but we need to throw an exception
    * to break the loop */    
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET _done = TRUE;

    DROP TABLE IF EXISTS `table2`;

    CREATE TABLE `table2` (
        `newcol` BIGINT UNSIGNED PRIMARY KEY
    );

    /* you open your PDOStatement */
    OPEN _myReader;

    /* myLoop is like a GOTO*/
    myLoop: LOOP

        /* $result->fetch_array(MYSQL_ASSOC)*/
        FETCH _myReader INTO _myField;

        /* if the no data exception had been thrown, 
        * goto the end of the loop */
        IF _done = 1 THEN 
            LEAVE myLoop;
        END IF;


        INSERT INTO `table2` (newcol) VALUES (_myField);

        ALTER TABLE `table2` ADD `_myField` BIGINT DEFAULT 0;

    END LOOP myLoop;

    /* close your PDO object */     
    CLOSE _myReader;

END //

【讨论】:

  • 我会尽快测试。您能否为每个语句添加一些注释细节,因为它对我和其他不熟悉此存储过程的人很有用。很难找到各种操作的简单示例,例如在存储过程中使用游标进行学习。
  • 现在好多了,有疑问,是否有任何替代方法可以在不使用游标的情况下实现这一目标?
  • 如果只是插入,我会做类似INSERT INTO table2 (newcol) SELECT col1 FROM table1 的操作,但您还需要更改表二以创建新字段。我认为目前的解决方案可能是最简单的。
  • INSERT INTO table2 (newcol) SELECT col1 FROM table1.
【解决方案2】:

Jonathan Parent Lévesque 帮助我弄清楚存储过程内部的循环是如何工作的,并获得与上述问题中描述的 php 代码等效的存储过程的整体结构。
谢谢 Jonathan Parent Lévesque
但是在他的代码中使用变量添加列名没有按预期工作。

终于明白了

BEGIN

    DECLARE _done BOOLEAN DEFAULT FALSE;
    DECLARE _myField BIGINT DEFAULT 0;

    DEClARE _myReader CURSOR FOR
    SELECT id FROM `tags`;

    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET _done = TRUE;

    DROP TABLE IF EXISTS `tag_similarity`;

    CREATE TABLE `tag_similarity` (
        `tag` BIGINT UNSIGNED PRIMARY KEY
    );

    OPEN _myReader;

    myLoop: LOOP

        FETCH _myReader INTO _myField;

        IF _done = 1 THEN 
            LEAVE myLoop;
        END IF;


        INSERT INTO `tag_similarity` (tag) VALUES (_myField);
        SET @sql = CONCAT('ALTER TABLE tag_similarity ADD `',_myfield,'` BIGINT DEFAULT 0');
      PREPARE stmt FROM @sql;
         EXECUTE stmt ;
         DEALLOCATE PREPARE stmt;
      END LOOP myLoop;

    CLOSE _myReader;

END

【讨论】:

    猜你喜欢
    • 2022-07-30
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多