0

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

脚步:

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

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

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

  4. 从临时表中删除行。

我知道如何做到这一点,但可能有更好、更清洁和更快的方法可以在一两个查询中实现这一目标。我主要担心的是,当表被重构时,查询应该仍然可以完成它的工作,而不会跳过较新的列。

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

4

4 回答 4

3

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

INSERT INTO newtable SELECT * FROM oldtable WHERE id = somevalue
于 2013-09-10T18:53:11.160 回答
1

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

请参阅 mysql手册。以下示例从手册中复制。

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只复制数据而不是模式。

于 2013-09-10T18:58:16.243 回答
1

以下是我能想到的两个替代想法:

  1. 将 BIT 或 BOOL 列添加到可以更新的表中,以便以一种或另一种方式“标记”记录,以便您可以在查询中对其进行过滤。
  2. 创建一个仅列出要标记的记录的 ID 的表。当您希望它被标记时在此字段中输入一个新 ID(替换删除和移动到第二个表的行为)并在您希望“取消标记”它时将其删除(替换从第二个表中删除它并重新的行为)将其添加到原始表中。

除了选项 1 所需的初始架构更改之外,无论原始表的架构发生任何更改,这两个选项都将起作用。如果您试图避免维护第二张表,我会考虑这些。

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

于 2013-09-10T19:05:48.347 回答
0

你可以这样做 :

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

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

INSERT INTO tbltemp (select * from table1);

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

于 2013-09-10T19:01:22.410 回答