Копирование записей из таблицы в таблицу: 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.

Подробнее о вставке выборки смотрите в документации к вашей СУБД, например:

  • INSERT ... SELECT синтаксис в MySQL: http://dev.mysql.com/doc/refman/5.1/en/insert-select.html
  • INSERT в PostreSQL: http://www.postgresql.org/docs/9.0/interactive/sql-insert.html

24 Август 2011

Комментарии (заморожены на какое-то время)

На этой странице еще нет комментариев.


Интернет реклама