Вкладені запити у операторі INSERT

За допомогою вкладеного select-запиту оператор insert дозволяє швидковставляти безліч записів з іншої (інших) таблиць.

 

Зауваження

Даний вид запитів з'явився у версії 3.23, тому синтаксис не вимагає записувативкладений запит в обов'язкові круглі дужки.

 

Представлені в попередньому розділі вкладені запити дозволяли заповнититаблицю new_orders тільки в момент створення. Однак якщо вже після створення таблиці клієнти оформляють угоди, то інформація в таблиціnew_orders втрачає свою актуальність. Виходом із ситуації буде створеннятаблиці new_orders за допомогою звичайного оператора create table(наступний приклад) з подальшим її оновленням.

 

CREATE TABLE neworders (

id_order INT(11) NOT NULL AUTO_INCREMENT,

user TINYTEXT,

ordertime DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',

number INT(11) NOT NULL DEFAULT '0',

product TINYTEXT,

PRIMARY KEY (id order))

ENGINE MyISAM DEFAULT CHARSET=cpl251;

 

У пропозиції from вкладеного запиту може з'являтися ім'я таблиці, в яку проводиться додавання нових записів. Ця можливість з'явилася в СУБДMySQL, починаючи з версії 4.0.14

 

Якщо число стовпців в таблиці, в яку відбувається вставка нових записів, і у вкладеному запиті не збігається і частина стовпців отримує значення заумовчанням або якщо порядок слідування стовпців у вкладеному запиті незбігається з порядком слідування стовпців в цільовій таблиці, можнаскористатися конструкцією values ??оператора insert , яка дозволяє задати іменастовпців і їх порядок при додаванні (приклад).

 

insert into new_orders

values (id_order, ordertime, product, user)

select orders.id_order as id_order,

orders .ordertirne as ordertime,

products.name as product

concat(users.surname, " ", substring(users.name, 1,1), " ",

substring(users.patronymic,1,1), ".") as user

from orders, users, products

where orders.id_user = users.id_user and

orders.id_product = products.id_product;