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
)
当然,我无法测试它,但它在我的计算机上编译得很好
$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