INSERT INTO…SELECT所有MySQL列


119

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

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设置为主键。


1
定义“不起作用”。我遇到了可能是类似的问题,但我不能告诉您,因为您没有说出问题所在!
Lightness Races in Orbit

它没有坏,只是不起作用。
网站站长G

Answers:


218

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

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表。如果您的目标表为空,那么这将不是问题。


73

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

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

6
左连接+1,以避免主键冲突。
哈特利·布罗迪

23

除了Mark Byers答案:

有时您还想插入Hardcoded详细信息,否则可能会有Unique约束失败等。因此,在覆盖某些列值的情况下,请使用following。

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

在这里,域名是由我以硬编码方式添加的,以摆脱唯一性约束。


4

您是否不需要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'));

2
OP正在使用 INSERT INTO .. SELECT FROM,而不是INSERT INTO .. VALUES。不同的功能。
Lightness Races in Orbit

0

更多示例和详细信息

    INSERT INTO vendors (
     name, 
     phone, 
     addressLine1,
     addressLine2,
     city,
     state,
     postalCode,
     country,
     customer_id
 )
 SELECT 
     name,
     phone,
     addressLine1,
     addressLine2,
     city,
     state ,
     postalCode,
     country,
     customer_id
 FROM 
     customers;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.