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;