Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql在表之间移动行_Php_Mysql - Fatal编程技术网

Php mysql在表之间移动行

Php mysql在表之间移动行,php,mysql,Php,Mysql,我有两张桌子,表一和表二 我在表1中有一行,希望将其移动到表2,并将其从表1中删除。基本上是剪切+粘贴 我正在使用php。我目前的计划是从表1中选择,用php存储数据,插入到表2中,然后从表1中删除。这似乎是一个很长的过程 这真的是最好的方法吗?用于从另一个表插入数据您至少需要两个查询: INSERT INTO table2 (column_name1, column_name2) SELECT column_name1, column_name2 FROM table 1 WHERE <

我有两张桌子,表一和表二

我在表1中有一行,希望将其移动到表2,并将其从表1中删除。基本上是剪切+粘贴

我正在使用php。我目前的计划是从表1中选择,用php存储数据,插入到表2中,然后从表1中删除。这似乎是一个很长的过程


这真的是最好的方法吗?

用于从另一个表插入数据

您至少需要两个查询:

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实现这一点的捷径,只需将其设置为一个表,并设置一个标志字段,以确定记录是否被管理

所以,您只需要简单的更新查询


一般来说,这样的事情就是这样做的。

我发现我必须在初始查询和插入之间准备数据。这是一个基于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));
}

简单明了,没有错误检查,等等。

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

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

假设表1和表2有这样的结构

|id |字段1 |字段2

您可以进行以下两个查询:

INSERT INTO table2
SELECT *
FROM table1
WHERE <your_where_clause>

DELETE FROM table1 
WHERE table1.id in
(SELECT table2.id 
FROM table2)

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

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

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

使用以下命令:

$query = mysql_query(insert into table1)
与此相反:

mysql_query(insert into table2)
在插入表1的查询下面写下:

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

它使您有权一次执行两个查询

所问问题的简短答案是,很多人已经回答了,没有

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

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

未在MySQL引擎中内部移动,但用于用户/查询

我会在如下事务中使用并包装命令:

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;

为什么要将行从一个表移动到另一个表?对我来说,这听起来像是一个非常糟糕的数据库设计。@Richard:可能有正当的理由。不过,我能想到的都是超大的表。@Richard,存档对我来说似乎是合法的理由。@RichardKnop我想从表中删除数据,但我永远不想让它消失。我不想在我的当前表中将它标记为非活动的或类似的,因为这会在检索时增加一个我必须搜索的参数。所以我把它移到一个相同的表中,并一直保持它。如果它是一个长表,我可以插入INT table2*SELECT*表1中的idAh对不起!我的意思是,只要在很多列中……而且,使用*也不起作用。如果您使用的是非常大的活动表,那么在插入和删除新记录之间可能已经添加了这些表。此外,DELETE在非常大的表上可能会花费大量的时间,至少在InnoDB上是这样的,对于使用InnoDB的meIf来说,使用行级锁定,DELETE语句的速度不是很重要。如果您使用的是MyISAM,那么可以使用DELETE LOW PRIORITY来最小化对并发操作的影响。您可能还希望将整个INSERT和DELETE作为事务执行:欢迎使用StackOverflow!以后,请不要用大写字母写回复。