INSERT INTO … SELECT为所有MySQL列

我正尝试从以下位置移动旧数据:

this_table >> this_table_archive

复制所有列。 我试过这个,但是不起作用:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');

注意:这些表是相同的,并将id设置为主键。

手册中描述了正确的语法。 尝试这个:

 INSERT INTO this_table_archive (col1, col2, ..., coln) SELECT col1, col2, ..., coln FROM this_table WHERE entry_date < '2011-01-01 00:00:00'; 

如果id列是一个自动增量列,并且您已经在两个表中都有一些数据,那么在某些情况下,您可能希望省略列列表中的id并生成新的id,以避免插入原始中已存在的id表。 如果你的目标表是空的,那么这将不是一个问题。

对于语法来说,它看起来像这样(省略列表以隐含地表示“全部”)

 INSERT INTO this_table_archive SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00' 

如果已经在归档表中有数据,则避免主键错误

 INSERT INTO this_table_archive SELECT t.* FROM this_table t LEFT JOIN this_table_archive a on a.id=t.id WHERE t.entry_date < '2011-01-01 00:00:00' AND a.id is null # does not yet exist in archive 

除了马克·拜尔斯回答:

有时你也想插入Hardcoded的细节,否则可能会出现唯一约束失败等情况。所以在这种情况下,你可以使用下面的方法来覆盖某些列的值。

 INSERT INTO matrimony_domain_details (domain, type, logo_path) SELECT 'www.example.com', type, logo_path FROM matrimony_domain_details WHERE id = 367 

这里值是由我join硬编码的方式来摆脱独特的约束。

你不需要double()的值的位? 如果不尝试这个(虽然必须有更好的方法

 insert into this_table_archive (id, field_1, field_2, field_3) values ((select id from this_table where entry_date < '2001-01-01'), ((select field_1 from this_table where entry_date < '2001-01-01'), ((select field_2 from this_table where entry_date < '2001-01-01'), ((select field_3 from this_table where entry_date < '2001-01-01'));