【问题标题】:Copy content of one table to another, leaving the primary element将一个表格的内容复制到另一个表格,保留主要元素
【发布时间】:2014-01-07 23:13:52
【问题描述】:

我有两个具有相同元素的表,唯一的区别是有主键和自动增量的 id。

Table1 | Table2
id1(PK)| id2(PK)
col1   | col1
col2   | col2
col3   | col3

我知道一些快速的方法来做到这一点,

INSERT INTO table2 SELECT * FROM table1 where id1 = 2

在使用这种方法时,table2 的内容具有 id2 = 2,因为它将所有字段从 table1 直接复制到 table2,以限制, 我也可以用方法

INSERT INTO table2(col1,col2,col3) SELECT col1,col2,col3 FROM table1 WHERE id1 = 2

这种方式适合短表,但我的表中有很多列。

我需要一种快速的方法将所有列从 table1 复制到 table2 留下主列 id2,因为它是自动递增的。

就像我想将指定行从 table1 复制到具有不同 id2 的 table2(将作为其自动增量生成)。

有没有可能。

【问题讨论】:

  • 为什么不用WHERE 子句来标记!= id2。
  • 但仍然会将所有项目从 table1 复制到 table2 leving those = id2,我只想复制依赖于 id1 的表的特定行。

标签: mysql


【解决方案1】:

从 table1 复制所有行,除了 table2 中具有相同 id 的行

INSERT INTO table2(col1, col2, col3)
SELECT t1.col1, t1.col2, t1.col3    
FROM table1 t1
WHERE t1.id1 not in (SELECT id2 FROM table2);

【讨论】:

  • 首先这不是我正在做的,这将复制table1中id与id2不匹配的所有行,我只想复制一行,但不想将table1.id1复制到table2,id2会自动生成,因为它是自增的。
【解决方案2】:

如果您不想提及列名但想全部复制,则尝试将所有数据复制到临时表中,然后删除 pk_id 字段,然后将其余字段复制到所需的表中,最后删除临时表。

请参阅我对类似查询的回答之一: Mysql: Copy row but with new id


我们可以使用临时表先从主表缓冲,然后再用它复制到主表。我们可以从临时表中删除 pk 字段并将所有其他字段复制到第二个表中。

参考Tim Ruehsenreferred posting 中的回答:

CREATE TEMPORARY TABLE tmp_table SELECT * from first_table WHERE ...;
ALTER TABLE tmp_table drop pk_id; # drop autoincrement field
# UPDATE tmp_table SET ...; # just needed to change other unique keys
INSERT INTO second_table SELECT 0, tmp_table.* FROM tmp_table;
DROP TABLE tmp_table;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多