Blog » Копирование записей из таблицы в таблицу: INSERT-SELECT в SQL
Главное, вовремя остановиться, поймав себя на написании подобного кода (пример на PHP Database Objects):
$insert = $dbh->prepare('INSERT INTO cheapBooks VALUES (?)');
foreach($dbh->query('SELECT ID FROM Books WHERE price < 10') as $book){
// Insert cheap books into a temporary table
$insert->execute(array($book['ID']));
}
К сожалению, использование цикла — первое, что приходит в голову когда стоит задача как по полному копированию таблицы, так и по выборке и последующей вставке определённых полей и строк.
Стандарт SQL позволяет одним запросом переносить строки из одной таблицы в другую. Достаточно, вместо явного указания значений для вставки, использовать SELECT. То есть, приведённый выше пример можно переписать следующим образом:
INSERT INTO cheapBooks (ID) SELECT ID FROM Books WHERE price < 10
Или, к примеру, три последних книги на вашем складе являются подержанными. Поэтому, вы не только хотите записать их в таблицу дешёвых книг, но и указать в комментарии почему на них выставлена низкая цена:
INSERT INTO cheapBooks (ID, NOTE)
SELECT ID, 'Was in use'
FROM Books WHERE ID > (SELECT MAX(ID) FROM Books) - 3
Ну и, конечно же, если нужно полное копирование всех записей одной таблицы в другую, достаточно выполнить этот запрос:
INSERT INTO Books_copy SELECT * FROM Books
Заметьте, что если вам нужно выполнить именно копирование таблицы, а не всех записей находящихся в ней, то, быть может, производитель вашей базы данных предлагает более простое решение этой задачи, чем ручное создание пустой таблицы-копии и исполнение запроса подобного предыдущему. Например, в MySQL есть CREATE TABLE ... SELECT, а в PgSQL 9.2 CREATE TABLE AS.
Подробнее о вставке выборки смотрите в документации к вашей СУБД, например:
На этой странице еще нет комментариев.