Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为多个insert和alter表查询创建存储过程_Php_Mysql_Stored Procedures - Fatal编程技术网

Php 为多个insert和alter表查询创建存储过程

Php 为多个insert和alter表查询创建存储过程,php,mysql,stored-procedures,Php,Mysql,Stored Procedures,我想做的是 创建一个表“table2”,其中有一列“newcol” 从“表1”中选择“col1”的所有值,然后 对于表1 -将值插入表2的“newcol”和 -在“表2”中添加一列名为的(值来自表1的col1) 上面的代码在php中看起来非常简洁高效,但问题是它需要花费一些时间。所以我认为最好将这些代码转换为MySQL存储过程。因为我是存储过程新手,非常困惑。请帮助我 当然,我无法测试它,但它在我的计算机上编译得很好 $link->query("DROP TABLE IF EXISTS t

我想做的是

  • 创建一个表“
    table2
    ”,其中有一列“
    newcol
  • 从“
    表1
    ”中选择“
    col1
    ”的所有值,然后
  • 对于
    表1

    -将值插入表2的“
    newcol
    ”和

    -在“
    表2
    ”中添加一列名为
    来自
    表1的
    col1

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


    当然,我无法测试它,但它在我的计算机上编译得很好

    $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"");
      }
    

    Jonathan Parent Lévesque帮助我了解了存储过程中的循环是如何工作的,并获得了与上述问题中描述的php代码等效的存储过程的总体结构。
    谢谢Jonathan家长Lévesque
    但在他的代码中,使用变量添加列名并没有像预期的那样起作用。

    我终于明白了


    表和字段是否总是相同的,还是希望将这些值作为输入传递到存储过程中?我将很快进行测试。您能否为每个语句添加一些注释细节,因为这对我和其他不熟悉此存储过程的人都很有用。很难找到关于各种操作的简单示例,例如在存储过程中使用游标进行学习。现在更好了,我有一个疑问,在不使用游标的情况下是否有其他方法可以实现这一点?如果只是插入,我会做类似于插入到表2中(newcol)的操作从表1中选择col1,但是您还需要修改表2来创建新字段。我认为当前的解决方案可能是最简单的。
    INSERT INTO table2(newcol)从table1中选择col1
    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 //
    
    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