将数据从一个MySQL表移动到另一个表

5
我将尝试在用户单击名为“删除”的按钮时,将数据从一个数据库(注册表)移动到另一个数据库中的一个表(归档表)。
以下是我从Google上找到的尝试方法:
 $result=mysql_query("Insert Into archived (select * from registrations WHERE id=$id") ;
 $row = mysql_fetch_array($result);

这样并不能让它移动...有人能帮忙吗?


1
你的两个表格中列数相同吗? - Mihai
1
这些表格是相同的。 - user2418857
它们是否在同一个数据库中?同时请去除括号。 - Mihai
它们在同一个数据库中,什么是“括号”? - user2418857
@Mihai 或者“添加”一个括号;-) 请查看 peterm 的答案 - Funk Forty Niner
显示剩余3条评论
2个回答

7

首先,你缺少一个括号,但在这种情况下你根本不需要使用它。

将查询字符串更改为

Insert Into archived (select * from registrations WHERE id=$id)
                     ^                                        ^

或者只是
Insert Into archived select * from registrations WHERE id=$id

这里有一个关于it技术的内容需要翻译:

这是一个展示 SQLFiddle 的演示。

其次,INSERT 不会返回结果集,因此您不应使用mysql_fetch_array()

第三,如果您的意图是移动而非仅复制数据,则还需要在复制完成后删除已经复制的行。


现在,您可以将所有内容放入存储过程中。

DELIMITER $$
CREATE PROCEDURE move_to_archive(IN _id INT)
BEGIN
    START TRANSACTION;
    INSERT INTO archived 
    SELECT * 
      FROM registrations 
     WHERE id = _id;
    DELETE
      FROM registrations 
     WHERE id = _id;
    COMMIT;
END$$
DELIMITER ;

示例用法:

CALL move_to_archive(2);

这里是一个关于 SQLFiddle 的演示。


@peterm 这不应该是 WHERE id='$id' " 吗? - Funk Forty Niner
@Fred-ii- 不应该。 _id 是一个过程参数。 $id 可能会在 $result = mysql_query("CALL move_to_archive($id)"); 中使用,但是最好使用 mysqli 的参数化查询。 - peterm
@peterm 我明白,但我已经看到很多次人们没有用引号包装变量而导致程序无法工作。 - Funk Forty Niner
@peterm 我指的不是 WHERE id = _id;,而是 Insert Into archived select * from registrations WHERE id=$id - Funk Forty Niner
请使用 TRANSACTION!再加一分。 - Leandro Bardelli

1
您尝试的查询只是将信息从一个表复制到另一个表。然后您需要从第一个表中删除它:
INSERT INTO archived 
SELECT * FROM registrations WHERE id = $id;

DELETE FROM registrations WHERE id = $id;

我已经运行了这段代码,它已将其从注册表中删除,但没有移动到归档表中? - user2418857
@user2418857 你可能需要像这样用引号包装你的 $idSELECT * FROM registrations WHERE id = '$id'; 对于 DELETE 同样如此。 - Funk Forty Niner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接