я gt ;, ...)]
{VALUES ( lt; значеніе_столбца gt ;, ...)}
| lt; вираженіе_запроса gt;
| (DEFAULT VALUES)
Як видно з представленого синтаксису, список стовпців не є обов'язковим (про це говорять квадратні дужки в описі синтаксису). У тому випадку, якщо він відсутній, список значень, що вставляються повинен бути повний, тобто забезпечувати значення для всіх стовпців таблиці. При цьому порядок значень повинен відповідати порядку, заданому оператором CREATE TABLE для таблиці, в яку вставляються рядка. Крім того, ці значення повинні ставитися до того ж типу даних, що і стовпці, в які вони вносяться. В якості прикладу розглянемо вставку рядка в таблицю Посади, створену наступним оператором CREATE TABLE:
TABLE Посади (
назва varchar (50) NOT NULL,
категорія varchar (50) NOT NULL)
Нехай потрібно додати в цю таблицю посаду «Старший менеджер» і категорія Перша. Це можна зробити наступним оператором:
INTO Посади VALUES ( Старший менеджер raquo ;, Перша );
Якщо задати список стовпців, то можна змінити «природний» порядок їх проходження:
INTO Посади (назва, категорія) VALUES ( Старший менеджер raquo ;, Перша );
Здавалося б, це абсолютно зайва можливість, яка робить конструкцію тільки більш громіздкою. Однак вона стає виграшною, якщо стовпці мають значення за замовчуванням. Розглянемо наступну структуру таблиці:
TABLE Посади (
назва varchar (50) NULL,
категорія varchar (50) NOT NULL DEFAULT Друга)
Відзначимо, що тут значення всіх стовпців мають значення за замовчуванням (перше - NULL, а другий стовпець - категорія - Друга). Тепер ми могли б написати:
INTO Посади (назву) VALUES ( Старший менеджер );
У цьому випадку відсутнє значення при вставці рядка буде замінено значенням за замовчуванням - Вторячи. Зауважимо, що якщо для стовпця в операторі CREATE TABLE не вказано значення за замовчуванням і не вказано обмеження NOT NULL, яке забороняє використання NULL в даному стовпці таблиці, то мається на увазі значення за замовчуванням NULL.
Виникає питання: а чи можна не вказувати список стовпців і, тим не менш, скористатися значеннями за замовчуванням? Відповідь позитивна. Для цього потрібно замість явної вказівки значення використовувати зарезервоване слово DEFAULT:
INTO Посади VALUES ( Старший менеджер raquo ;, DEFAULT);
Оскільки всі стовпці мають значення за замовчуванням, для вставки рядка зі значеннями за замовчуванням можна було б написати:
INTO Посади VALUES (DEFAULT, DEFAULT);
Однак для цього випадку призначена спеціальна конструкція DEFAULT VALUES, за допомогою якої вищенаведений оператор можна переписати у вигляді
ITNO Посади DEFAULT VALUES;
Зауважимо, що при вставці рядка в таблицю перевіряються всі обмеження, накладені на цю таблицю. Це можуть бути обмеження первинного ключа або унікального індексу, перевірочні обмеження типу CHECK, обмеження посилальної цілісності. У разі порушення будь-якого обмеження вставлення рядка буде відхилена. Розглянемо тепер випадок використання підзапиту. Нехай нам потрібно вставити в таблицю Должності_А всі рядки з таблиці Посади, належать до категорії (категорія=Друга). Оскільки необхідні нам значення вже є в деякій таблиці, то формування рядків, що вставляються вручну, по-перше, є неефективним, а, по-друге, може допускати помилки введення. Використання підзапиту вирішує ці проблеми:
INTO Должності_А * FROM Должностікатегорія=Друга;
Використання в підзапит символу «*» є в даному випадку виправданим, оскільки порядок проходження стовпців є однаковим для обох таблиць. Якби це було не так, слід було б застосувати список стовпців або в операторі INSERT, або в підзапит, або в обох місцях, який приводив би у відповідність порядок проходження стовпців.
Відзначимо, що при використанні підзапиту, що містить предикат, будуть вставлені тільки ті рядки, для яких значення предиката одно TRUE (Не UNKNOWN!). Іншими словами, якби стовпець категорія в таблиці Посади допускав би NULL-значення, і це значення присутня б у ряді рядків, то ці рядки не були б вставлені в таблицю Должності_А.
Подолати обмеження на вставку одного рядка в операторі INSERT при використанні конструктора рядки в пропозиції VALUES дозволяє штучний прийом використання підзапиту, що формує рядок з пропозиці...