INSERT INTO...SELECT for all MySQL columns
Asked Answered
P

4

121

I'm trying to move old data from:

this_table >> this_table_archive

copying all columns over. I've tried this, but it doesn't work:

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

Note: the tables are identical and have id set as a primary key.

Plater answered 9/3, 2011 at 22:54 Comment(3)
Define "it doesn't work". I am having what may be a similar problem but I can't tell because you didn't say what your problem was!!Rotow
It's not broken, it just doesn't work.Cobnut
See also here https://mcmap.net/q/48078/-joining-three-tables-using-mysqlVanitavanity
B
220

The correct syntax is described in the manual. Try this:

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

If the id columns is an auto-increment column and you already have some data in both tables then in some cases you may want to omit the id from the column list and generate new ids instead to avoid insert an id that already exists in the original table. If your target table is empty then this won't be an issue.

Bristow answered 9/3, 2011 at 22:56 Comment(0)
S
79

For the syntax, it looks like this (leave out the column list to implicitly mean "all")

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

For avoiding primary key errors if you already have data in the archive table

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
Scooter answered 9/3, 2011 at 22:57 Comment(1)
+1 for the left join to avoid primary key collisions.Wateriness
A
22

Addition to Mark Byers answer :

Sometimes you also want to insert Hardcoded details else there may be Unique constraint fail etc. So use following in such situation where you override some values of the columns.

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

Here domain value is added by me me in Hardcoded way to get rid from Unique constraint.

Arian answered 7/12, 2015 at 10:40 Comment(0)
D
4

don't you need double () for the values bit? if not try this (although there must be a better way

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'));
Dibrin answered 9/3, 2011 at 22:59 Comment(1)
The OP is using INSERT INTO .. SELECT FROM, not INSERT INTO .. VALUES. Different feature.Rotow

© 2022 - 2024 — McMap. All rights reserved.