【问题标题】:mysql move row between tables [duplicate]mysql在表之间移动行[重复]
【发布时间】:2011-03-24 13:46:32
【问题描述】:

我有 2 个表,table1 和 table2。

我在 table1 中有一行,想将它移到 table2 并从 table1 中删除。基本上,剪切+粘贴。

我正在使用 php。我目前的计划是从table1中选择,将数据存储在php中,插入到table2中,然后从table1中删除。这似乎是一个非常漫长的过程。

这真的是最好的方法吗?

【问题讨论】:

  • 为什么要将行从一个表移动到另一个表?对我来说,这听起来像是一个非常糟糕的数据库设计。
  • @Richard:可能有正当理由。不过,我能想到的都涉及怪物大小的桌子。
  • @Richard,存档对我来说似乎是正当理由。
  • @RichardKnop 我想从表中删除数据 - 但我从不希望它消失。我不想在当前表中将其标记为“非活动”或类似的,因为这增加了一个我在检索时必须搜索的参数。所以我把它移到一张相同的桌子上,并一直拥有它。

标签: mysql


【解决方案1】:

您将需要至少 2 个查询:

INSERT INTO table2 (column_name1, column_name2) SELECT column_name1, column_name2 FROM table 1 WHERE <insert_where_clause_here>

DELETE FROM table1 WHERE <your_where_clause>

我没有看到使用 MySQL 的更短的方法

【讨论】:

  • 如果它是一个长表,我可以做 INSERT INT table2 * SELECT * FROM table1 WHERE id
  • 对不起!我的意思是在很多列中……此外,使用 * 不起作用。
  • 如果您正在使用非常大的活动表,在 INSERT 和 DELETE 之间可能已经添加了新记录,请注意。此外,DELETE 可能会在非常大的表上花费大量时间(至少 InnoDB 对我来说就是这种情况)
  • 如果使用 InnoDB,它使用行级锁定,DELETE 语句的速度不是很重要。如果您使用的是 MyISAM,则可以使用 DELETE LOW PRIORITY 以尽量减少对并发操作的影响。您可能还希望将整个 INSERTDELETE 作为事务执行:dev.mysql.com/doc/refman/5.0/en/commit.html
【解决方案2】:

使用INSERT INTO ... SELECT 插入另一个表中的数据

【讨论】:

    【解决方案3】:

    我必须解决同样的问题,这就是我用作解决方案的方法。

    要使用此解决方案,源表和目标表必须相同,并且必须在第一个表中具有唯一且自动递增的 id(以便永远不会重复使用相同的 id)。

    假设 table1 和 table2 具有这种结构

    |id|field1|field2

    您可以进行这两个查询:

    INSERT INTO table2
    SELECT *
    FROM table1
    WHERE <your_where_clause>
    
    DELETE FROM table1 
    WHERE table1.id in
    (SELECT table2.id 
    FROM table2)
    

    在我看来,这比 Pieter888 建议的解决方案更好,因为该解决方案没有考虑到选择的数据可能与删除的数据不同(因为表 1 中的数据可以在第一个和第二个之间更改查询),而这样你是安全的。

    【讨论】:

      【解决方案4】:

      只要做一个表并做一个标志字段来确定记录是否被审核。

      因此,您唯一需要的只是简单的更新查询。

      一般都是这样处理的。

      【讨论】:

        【解决方案5】:

        我发现我必须在初始查询和插入之间准备数据。这是在基于 codeigniter 的 CMS 上,因此它使用它们的函数和返回格式,但可能会对某人有所帮助。

        function move_row($id = 0) {
            /* first copy it from table_one to table_two */
            $query = $this->db->query('select * from table_one where id = ' . $id);
            $row = $query->row_array(); /* this appears to be required */
            $this->db->insert('table_two',$row);
        
            /* then delete it from table_one */
            return($this->db->query('delete from table_one where id = ' . $id));
        }
        

        (准系统,无错误检查等)

        【讨论】:

          【解决方案6】:

          对所问问题的简短回答,正如很多人已经回答的那样,不。

          但我感觉您正在寻找的是一种在一次操作中插入新表并从旧表中删除的方法。这就是transactions 的用途。

          在提交事务之前,更改不会受到影响,这与实际移动的行具有相同的效果。

          (不在 MySQL 引擎内部移动,而是用于用户/查询)

          我会使用 INSERT SELECT 并将命令包装在 TRANSACTION 中,如下所示:

          DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
          BEGIN 
            ROLLBACK; 
            CALL ERROR_ROLLBACK_OCCURRED; 
          END;
          
          START TRANSACTION;
          INSERT INTO table_new SELECT a,b,c FROM table_old WHERE x = 'something';
          DELETE FROM table_old WHERE x = 'something';
          COMMIT;
          

          【讨论】:

            【解决方案7】:

            您可以像这样一次使用多个查询

            在具有提交表1数据功能的命令按钮上

            使用这个:

            $query = mysql_query(insert into table1)
            

            而不是这个:

            mysql_query(insert into table2)
            

            在插入表 1 的查询下写下:

            $query2 = mysql_query(INSERT into TABLE2)
            TRUNCATE TABLE TABLE2;
            

            它赋予您一次执行两个查询的权限

            【讨论】:

            • 欢迎来到 StackOverflow!以后请不要全部大写。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-29
            • 2014-12-29
            • 2015-02-18
            • 2022-11-27
            相关资源
            最近更新 更多