【问题标题】:Mysql Select row, update values and insert into another tableMysql选择行,更新值并插入另一个表
【发布时间】:2018-09-09 15:22:29
【问题描述】:

我有一个包含一些行的临时表:

$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,更新“类型”(例如)并将整个选定行插入另一个表(与该表具有相同的列)。

我试过了,但在 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)); 

}

【问题讨论】:

    标签: mysql select insert


    【解决方案1】:

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

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

    这假定另一个目标表的列名称与您的第一个表相同。如果没有,那么您将不得不更改我的查询的第一行。

    请注意,理想情况下,您应该在此处使用准备好的语句。

    【讨论】:

    • 栏目很多,如果可能的话我不想一一列举。
    • 在插入过程中列出所有列始终是最佳实践。如果您确实有数百列,则可能表明表格设计不佳。
    • 如果必须创建表,您可以使用创建表代替插入选择。 (CREATE TABLE new_table AS (SELECT * FROM old_table) 并以类似的方式进行更新;
    • @Juan 你不需要删除你的答案。毕竟,每个奥林匹克规模的游泳池都有六个泳道;-)
    • @Juan - 我需要创建临时表,因为我导入了在添加到真实表之前需要更改的 csv
    【解决方案2】:

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

    START TRANSACTION;
    
    INSERT INTO table2 SELECT * FROM table1 WHERE id = 57;
    
    UPDATE table2 SET columnYouWantToChange="New Value" WHERE id = 57;
    
    COMMIT;
    

    但也许你应该 OUTLINE,你想要实现什么?有 2 个具有相同列的表“闻起来”像糟糕的设计。也许您最好使用同一张表以及数据行的修订号?

    【讨论】:

    • 我需要创建临时表,因为我导入了在添加到真实表之前需要更改的 csv
    • @Toniq 然后你应该用一小段代码读取 csv,并在插入它们之前更改值。看起来你在 PHP 上运行,所以试试php.net/manual/en/function.fgetcsv.php
    • 这会比将文件中的数据加载到临时表然后返回普通表更快吗?
    • @Toniq 我不这么认为,因为中间会有另一层。但是有一个简单的方法可以解决这个问题:试试吧。
    【解决方案3】:

    您的 SQL 无效,您有一个带有 set 语句的插入语句。
    您所需要的只是一个基本的 INSERT SELECT,这也不需要 for 循环。

    INSERT INTO $another_table (id, type, title) 选择 id、'foo'、标题 来自 {$tn}

    您可以在插入所有行之后执行 set 语句作为更新,如果这样更容易让您了解的话。

    更新 $another_table SET id = NULL

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-31
        • 2016-06-30
        • 2018-02-25
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多