如何将没有主键的表复制到另一个表中

9
我想要将一个表复制到另一个表。
例如,我有表 Data(ID, time, serial_number...) 和表 Temp_data(ID, time, serial_number...) 如何复制所有没有主键(ID)的项目。
我正在使用MYSQL, 我尝试过 INSERT INTO Data SELECT * FROM Temp_data; 问题在于主键。这两个表已经有了值,除了ID之外,我需要复制所有内容。

PK是一个自动增量的标识符吗? - paparazzo
那就是为什么你需要选择其他列并将 iden 排除在外。请参阅答案。 - paparazzo
3个回答

10

不要使用SELECT *,应该列出你需要的列:

INSERT INTO Data (time, serial_number...)
  SELECT (time, serial_number...) FROM Temp_data;

8
我不知道MySQL的情况,但在PostgreSQL中,如果你在选择字段时使用圆括号,会收到一个错误提示。正确的写法是:INSERT INTO Data (time, serial_number...) SELECT time, serial_number... FROM Temp_data; 不需要加圆括号。 - Sven Koschnicke
@eggyal 如果我想一次插入选定列的几条记录,该怎么做呢?例如,如果我想一次插入5000行,应该怎么做? - node_man
@pravinnavle:你可以在SELECT语句中添加WHERE子句,例如WHERE id BETWEEN 5000 AND 10000WHERE created >= '2018-01-01' AND created < '2019-01-01'等等。但是我真的想不出为什么有人会想以这种方式分块插入数据,特别是源表可能在块之间被更新,导致数据不一致,除非你小心处理... - eggyal
实际上,我有一张没有主键,也没有任何与日期相关的字段的表,我想将这个表中的数据复制到另一个不同服务器上的表中。SQL转储可以完成这项工作,但我想一次只复制几行。 - node_man
@pravinnavle:那些只是例子。使用你所拥有的任何列。 - eggyal

7

如果您的查询中没有定义列名,系统将会插入所有列

INSERT INTO tbl2 (column1, column2)
    SELECT tbl1.col1, tbl1.col2 FROM tbl1

4

这是一个非常烦人的问题,因为每次您需要更新列时,还需要更新复制它们的代码。以下是我用来解决问题和未来证明代码的解决方案:

    DROP TABLE IF EXISTS TempData;
    CREATE TEMPORARY TABLE TempData (LIKE Data);
    
    INSERT INTO TempData SELECT * FROM Data;
    
    ALTER TABLE TempData CHANGE COLUMN `id` `id` INT(11) NULL, DROP PRIMARY KEY;
    UPDATE TempData SET id = 0;
    
    INSERT INTO Data SELECT * FROM TempData;
    DROP TABLE IF EXISTS TempData;

快速、简单,只要源表名相同,每次都可以正常工作。


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