我有一个带有一些行的临时表:
$query = "CREATE TEMPORARY TABLE {$tn} (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(255) NOT NULL,
`title` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB";
我想选择该表中的每一行,对ID进行nulify,更新“ type”(例如),然后将整个选定的行插入到另一个表(该表具有与该表相同的列)中。
我尝试了这个,但是在SET附近出现了错误(您的SQL语法有误;请查看与您的MariaDB服务器版本相对应的手册,以获取在'SET附近使用正确的语法)
foreach ($ids as $id) {//this is each id in temp table
$query = "INSERT INTO $another_table
SELECT * FROM {$tn} WHERE id='$id'
SET id=NULL, type='foo'";
$result = $conn->query($query) or die(mysqli_error($conn));
}
答案 0 :(得分:1)
我不是PHP专家,但这是您应该遵循的语法。您可以从表中选择任意数量的常量。
call
这假定另一个目标表的列与第一个表使用相同的名称。如果没有,那么您将不得不更改查询的第一行。
请注意,理想情况下,您应该在此处使用准备好的语句。
答案 1 :(得分:1)
如果两个表都具有相同数量的列,并且顺序相同,并且您希望避免列出每个列,则只需复制条目并在同一事务中更新更改的值即可:
START TRANSACTION;
INSERT INTO table2 SELECT * FROM table1 WHERE id = 57;
UPDATE table2 SET columnYouWantToChange="New Value" WHERE id = 57;
COMMIT;
但是也许您应该概述,您要实现的目标是什么?有两个具有相同列的表“闻起来”,就像不良的设计一样。也许您最好将同一张表以及数据行的修订号一起使用?
答案 2 :(得分:0)
您的SQL无效,您的插入语句中包含set语句。
您所需要做的只是一个基本的INSERT SELECT,这也不需要for循环。
插入INTO $ another_table(ID,类型,标题) SELECT ID,'foo',标题 来自{$ tn}
在插入所有行之后,如果可以更轻松地进行操作,则可以将set语句作为更新执行。
更新$ another_table SET id = NULL
答案 3 :(得分:0)
仅供参考,如果您希望SET
来自具有相同列名的表中的许多列或所有列,此查询在information_schema
上运行将为您生成代码中最繁琐的部分:
select concat('target.', column_name ,' = ','source.', column_name ,', ') as line
from `columns`
where `columns`.table_name = 'target';