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 установленный в качестве первичного ключа.

Ответ 1

Правильный синтаксис описан в руководстве . Попробуйте следующее:

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 являются столбцами с автоинкрементами, и у вас уже есть данные в обеих таблицах, тогда в некоторых случаях вы можете опустить идентификатор из списка столбцов и генерировать новые идентификаторы вместо этого, чтобы не вставлять уже существующий идентификатор в исходной таблице. Если ваша целевая таблица пуста, это не будет проблемой.

Ответ 2

Для синтаксиса это выглядит так (оставьте список столбцов неявным значением "все" )

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

Ответ 3

Дополнение к Mark Byers отвечает:

Иногда вам также нужно вставлять детали Hardcoded, иначе может произойти сбой уникального ограничения и т.д. Поэтому используйте следующую команду в такой ситуации, когда вы переопределяете некоторые значения столбцов.

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

Здесь значение domain добавлено мной в Hardcoded, чтобы избавиться от ограничения Unique.

Ответ 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'));

Ответ 5

Больше примеров и деталей

    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;