MySQL选择行,更新值并插入另一个表

时间:2018-09-09 15:22:30

标签: mysql select insert

我有一个带有一些行的临时表:

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

}

4 个答案:

答案 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

https://dev.mysql.com/doc/refman/8.0/en/insert-select.html

答案 3 :(得分:0)

仅供参考,如果您希望SET来自具有相同列名的表中的许多列或所有列,此查询在information_schema上运行将为您生成代码中最繁琐的部分:

select concat('target.', column_name ,' = ','source.', column_name ,', ') as line
from `columns` 
where `columns`.table_name = 'target';