Команда INSERT INTO SELECT используется для копирования записей из одной таблицы в другую существующую таблицу. Например:
1 2 3 |
INSERT INTO OldCustomers SELECT * FROM Customers; |
Здесь мы копируем все записи из таблицы Customers в таблицу OldCustomers.
Примечание: Чтобы запустить SQL-запрос выше, в базе данных уже должна быть таблица с именем OldCustomers, а имена столбцов таблицы OldCustomers и таблицы Customers должны совпадать. Если нужно скопировать данные в новую таблицу (а не в существующую), следует использовать команду SELECT INTO.
Cкопировать только выбранные столбцы
Мы также можем скопировать только выбранные столбцы из одной таблицы в другую. Например:
1 2 3 |
INSERT INTO OldCustomers(customer_id, age) SELECT customer_id, age FROM Customers; |
Здесь мы копируем данные только из столбцов customer_id и age в таблицу OldCustomers.
Примечание: Если в таблице OldCustomers, кроме customer_id и age, есть другие столбцы, то значениями этих столбцов будет NULL.
Cкопировать данные, соответствующие условию
Мы можем использовать оператор WHERE
с INSERT INTO
для копирования тех строк, которые соответствуют указанному условию. Например:
1 2 3 4 |
INSERT INTO OldCustomers SELECT * FROM Customers WHERE country = 'USA'; |
Здесь мы копируем все строки из таблицы Customers, где значением столбца country является USA
, в таблицу OldCustomers.
Cкопировать данные из двух таблиц в одну
Можно скопировать данные из двух разных таблиц в одну, используя оператор JOIN с INSERT INTO SELECT
. Например:
1 2 3 4 5 |
INSERT INTO OldCustomerOrders SELECT Customers.customer_id, Customers.first_name, Orders.amount FROM Customers JOIN Orders ON Customers.customer_id = Orders.customer_id; |
Здесь мы копируем customer_id и first_name из таблицы Customers и amount из таблицы Orders в существующую таблицу OldCustomerOrders.
Примечание: Если в существующей таблице уже есть данные, то будут добавлены новые строки. Столбцы в существующей таблице могут бросать такие ошибки, как NOT NULL Constraint Fail
, UNIQUE Constraint Failed
при копировании данных.
Избегайте дублирования данных в INSERT INTO SELECT
Если уже есть строка с похожим значением, SQL может выдать ошибку при использовании команды INSERT INTO SELECT
. Однако мы можем пропустить копирование повторяющихся строк, используя оператор NOT EXISTS. Например:
1 2 3 4 5 6 7 8 |
INSERT INTO OldCustomers(customer_id, age) SELECT customer_id, age FROM Customers WHERE NOT EXISTS( SELECT customer_id FROM OldCustomers WHERE OldCustomers.customer_id = Customers.customer_id ); |
Здесь мы скопируем строку в таблицу только в том случае, если customer_id в таблице не имеет такое же значение, которое мы пытаемся скопировать.