Вкладені запити в операторі CREATE TABLE

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

У прикладі представлений запит, який створює таблицю new orders, в якій на відміну від таблиці orders замість зовнішніх ключів, що пов'язують таблицю зіншими таблицями (users, products), розміщені стовпці для прізвища (surname), імені (name), по батькові (patronymic) клієнта та назви товарноїпозиції (product).

 

CREATE TABLE new_orders (

id_order INT(11) NOT NULL AUTO INCREMENT,

user TINYTEXT,

ordertime DATETTME 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

SELECT orders.id_order AS id_order,

CONCAT(users.surname, " ", SUBSTRING(users.name,1,1), ".",

SUBSTRING(users.patronymic,1,1), ".") AS user,

orders.ordertime AS ordertime,

orders.number AS number,

products.name AS product

FROM orders, users, products

WHERE orders.id_user = users.id_user AND

orders.id_product = products. id_product;

 

SELECT * FROM new_orders;

 

id_order user ordertime number product

1 Сімідянов И.В. 2005-01-04 10:39:38 1 Intel Pentium 4

2 Корнєєв A.A. 2005-02-10 09:40:29 2 Gigabyte GA

 

Як видно з прикладу для того щоб заповнити тільки що створену таблицюnew_orders, достатньо в кінці оператора create table помістити вкладенийзапит. Стовпцям у вкладеному запиті необхідно призначати псевдоніми за допомогою оператора as. Якщо цього не зробити, запит може завершитисяпомилкою або ж будуть отримані небажані імена в кінцевій таблиці.

 

Зауваження

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

 

Слід зазначити, що стовпці, які присутні у описі таблиці, але відсутні у вкладеному запиті, отримують значення за замовчуванням (наступнийприклад).

 

CREATE TABLE new_orders (

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

SELECT orders.id_order AS id order,

CONCAT(users.surname, " ", SUBSTRING(users.name,1,1),

SUBSTRING(users.patronymic,1,1), ".") AS user,

orders.ordertime AS ordertime,

products.name AS product

FROM orders, users, products

WHERE orders.id_user = users.id_user AND

orders.id_product = products.id_product;

 

id_order user ordertime number produc

1 Сімідянов И.В. 2005-01-04 10:39:38 0 Intel Pentium|

2 Корнєєв A.A. 2005-02-10 09:40:29 0 Gigabyte GA-8I848P

 

У прикладі в структурі таблиці new_order присутній стовпець number, однак у вкладеному запиті, який заповнює щойно створену таблицю, стовпець numberпропущений. Це призводить до того, що він отримує значення за замовчуванням - 0.

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

 

CREATE TABLE new_orders (

id_order INT(11) NOT NULL AUTO_INCREMENT,

PRIMARY KEY (id_order))

ENGINE=MyISAM DEFAULT CHARSET=cpl251

SELECT orders.id_order AS id_order,

CONCAT(users.surname, " ", SUBSTRING(users.name,1,1), ".",

SUBSTRING(users.patronymic,1,1), ".") AS user,

orders.ordertime AS ordertime,

products. name AS product

FROM orders, users, products

WHERE orders.id_user = users.id_user AND

orders.id_produсt = products.id_product;

 

SELECT * FROM new_orders;

 

id_order user ordertime product

2 Корнєєв A.A. 2005-02-10 09:40:29 Gigabyte GA-8I848P

3 Іванов А.В. 2001-10-08 13:41:05 Maxtor 6Y120P0

 

Незважаючи на те, що оператор create table визначає один-єдиний стовпецьid_order, створена таблиця new_orders містить чотири стовпці, три з яких з'явилися завдяки присутності в результуючій таблиці вкладеного select запиту.

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