只需将行移动到另一个表并返回

时间:2013-09-10 18:47:59

标签: php mysql

是否有一种简单的方法来选择一行并将其插入另一个具有完全相同列的表中?它需要保留id并能够稍后将其移回。

步骤:

  1. 使用相同的ID时,将整行移动到相同的临时表(使用不同的名称)。

  2. 从旧表中删除行(我知道这一点,别担心;)

  3. 将行从临时表移回原始表,同时使用相同的原始ID。

  4. 从临时表中删除行。

  5. 我知道如何做到这一点,但在一两个查询中可能有更好,更清晰,更快捷的方法来实现这一点。我主要担心的是,当表被重构时,查询仍然可以在不跳过新列的情况下完成其工作。

    我希望有人可以提出一个好的建议:)

4 个答案:

答案 0 :(得分:3)

假设表格具有相同的列,您应该可以这样做:

INSERT INTO newtable SELECT * FROM oldtable WHERE id = somevalue

答案 1 :(得分:1)

您使用CREATE TABLE ... SELECT创建表格,然后使用它。这将创建一个表格,其中包含SELECT列的原始表格。然后,您可以从原始表中删除行,使用INSERT INTO ... SELECT将行移回原始表,然后删除临时表。这样,您不需要维护两个表,并且临时表将始终从原始表中获取最新列。

请参阅mysql manual。以下示例从手动复制。

mysql> SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+

mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM bar;
+------+---+
| m    | n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)

所以你需要这样的东西

CREATE TABLE bar SELECT * FROM foo WHERE fooColumn = 'whatever';
DELETE FROM foo where fooColumn <> 'whatever';
INSERT INTO foo SELECT * FROM bar;
DROP TABLE bar

如果您想避免过于频繁地创建和删除表,只需创建一次临时表。

INSERT INTO bar SELECT * FROM foo WHERE fooColumn = 'whatever';
DELETE FROM foo where fooColumn <> 'whatever';
INSERT INTO foo SELECT * FROM bar;

但请确保您始终保持临时表和原始表同步,即如果您在原始表中添加或删除列,请确保在INSERT INTO ... SELECT仅复制临时表中立即复制该列数据不是架构。

答案 2 :(得分:1)

以下是我能想到的另外两个想法:

  1. 将BIT或BOOL列添加到可以更新的表中,以便以某种方式“标记”该记录,以便您可以在查询中对其进行过滤。
  2. 创建一个表,列出您要标记的记录的ID。当你想要标记时,在这个字段中输入一个新的ID(替换删除和移动到第二个表的行为),当你想要“取消标记”它时将其删除(取代从第二个表中删除它的行为并重新将其添加到原始表格中。
  3. 除了选项1所需的初始架构更改之外,无论原始表架构的任何更改如何,这两个选项都将起作用。如果你试图避免维护第二个表,我会考虑这些。

    如果您确实希望复制到保留表并从原始表中删除,然后将其复制回原始表,并从保留表中删除,请务必将这些操作包装到transaction中。如果事情没有按计划进行,你不会得到重复的数据或数据丢失。

答案 3 :(得分:0)

你可以这样做:

INSERT INTO tbltemp (Select * from table1 where someid=somevalue)

或者您可以将整个表格移动到另一个表格中:

INSERT INTO tbltemp (select * from table1);

无论您做什么,请注意您需要移动/复制的记录/记录不得包含目标表中已存在的任何主键值。