Оглавление

14.1. Заполнение таблицы с помощью вложенного запроса

При изучении временных таблиц мы уже использовали вложенный запрос для заполнения временной таблицы. Заполнять можно не только временные таблицы, но и обычные таблицы, создаваемые с помощью оператора CREATE TABLE. Создадим таблицу orders_item_table с помощью вложенного запро- са:
CREATE TABLE `orders_item_table` (
`id_orders` INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id_orders`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
SELECT `orders_table`.`id_orders` AS `id_orders`,
`users_table`.`name` AS `user`,
`product_table`.`name_product` AS `name`,
`orders_table`.`count` AS `count`
FROM `users_table`, `product_table`, `orders_table`
WHERE `orders_table`.`id_user` = `users_table`.`id_user` AND
`orders_table`.`id_product` = `product_table`.`id_product`;

 
Выведем структуру созданной таблицы с помощью SQL-запроса:
DESCRIBE `orders_item_table`\G

 
Эта команда SQL выведет:
*************************** 1. row ***************************
Field: id_orders
Type: int(11)
Null: NO
Key: PRI
Default: NULL
Extra: auto_increment
*************************** 2. row ***************************
Field: user
Type: varchar(255)
Null: YES
Key:
Default: NULL
Extra:

*************************** 3. row ***************************
Field: name
Type: varchar(255)
Null: YES
Key:
Default: NULL
Extra:
*************************** 4. row ***************************
Field: count
Type: int(11)
Null: YES
Key:
Default: NULL
Extra:

 
Как видно из результата, столбцы, не определенные в операторе CREATE TABLE, но имеющиеся в результирующей таблице, добавляются в новую таблицу. Если столбцы определены в операторе CREATE TABLE, но отсутствуют во вложенном запросе, то они получают значение по умолчанию.
Использовать вложенные запросы можно и в операторе INSERT. Создадим таблицу orders_item2_table обычным образом:
CREATE TABLE `orders_item2_table` (
`id_orders` INT NOT NULL AUTO_INCREMENT,
`user` VARCHAR(255),
`name` VARCHAR(255),
`count` INT,
PRIMARY KEY (`id_orders`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Затем добавим записи с помощью оператора INSERT и вложенного запроса.
INSERT IGNORE INTO `orders_item2_table`
SELECT `orders_table`.`id_orders` AS `id_orders`,
`users_table`.`name` AS `user`,
`product_table`.`name_product` AS `name`,
`orders_table`.`count` AS `count`
FROM `users_table`, `product_table`, `orders_table`
WHERE `orders_table`.`id_user` = `users_table`.`id_user` AND
`orders_table`.`id_product` = `product_table`.`id_product`;

 

С помощью ключевых слов IGNORE и REPLACE можно указать, как следует обрабатывать записи с дублированными значениями. При использовании ключевого слова IGNORE повторяющиеся записи отбрасываются, а при использовании REPLACE — новые записи заменяют существующие. Если ни одно из ключевых слов не указано и производится попытка вставить повторяющееся значение, то это приведет к ошибке.

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити