mysql选择行,更新值并插入到另一个表中

ccgok5k5  于 2021-06-19  发布在  Mysql
关注(0)|答案(4)|浏览(428)

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

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

我想选择这个表中的每一行,nulify id,更新'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)); 

}
vmdwslir

vmdwslir1#

sql无效,您的insert语句中包含set语句。
所有你需要的是一个基本的插入选择这也是不需要for循环。
插入到另一个表(id,type,title)中,从{$tn}中选择id,'foo',title
您可以在插入所有行之后将set语句作为一个更新来执行,如果这更容易让您了解的话。
更新$another\u table set id=null
https://dev.mysql.com/doc/refman/8.0/en/insert-select.html

nbnkbykc

nbnkbykc2#

我不是phpMaven,但这是您应该遵循的语法。您可以从表中选择任意数量的常量。

INSERT INTO $another_table (id, type, title)
SELECT NULL, 'foo', title
FROM {$tn}
WHERE id = '$id';

这假设另一个目标表的列使用与第一个表相同的名称。如果没有,那么您必须更改我的查询的第一行。
请注意,您最好在这里使用一个准备好的语句。

wooyq4lh

wooyq4lh3#

如果两个表的列数相同,顺序相同,并且希望避免列出每一列,则可以复制条目并更新同一事务中更改的值:

START TRANSACTION;

INSERT INTO table2 SELECT * FROM table1 WHERE id = 57;

UPDATE table2 SET columnYouWantToChange="New Value" WHERE id = 57;

COMMIT;

但也许你应该概述一下,你想要达到的目标是什么?有两个相同列的表“闻起来”像是糟糕的设计。也许您最好使用同一个表以及数据行的修订号?

41zrol4v

41zrol4v4#

如果你想的话,我会告诉你的 SET 运行此查询的表中具有相同列名的许多或所有列 information_schema 将为您生成代码中最乏味的部分:

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

相关问题