Основна синтаксична форма виразу вставки кортежу в відношення має вигляд:
де - список атрибутів відношення R,
- значення компонентів A, які вставляються.
Якщо список атрибутів не охоплює всі атрибути R, то компонентам кортежу, відсутнім у списку, присвоюється значення по замовчанню (зокрема, це може бути NULL).
Приклад 5.17. Поповнимо відношення StarsIn новим фактом зйомки актора у фільмі.
Значення рядка 2 ставляться у відповідність атрибутам відношення StarsIn у порядку, вказаному у першому рядку.
Якщо вставляються всі атрибути, список атрибутів можна опустити:
В цьому разі компонентам кортежу, що вставляється, значення присвоюються в порядку, визначеному при створенні відношення.
Якщо треба вставити не один кортеж, а багато, замість речення VALUES можна використати підзапит, який повертає цю множину кортежів.
Приклад 5.18. Нехай треба доповнити відношення
назвами студій, які містяться у відношенні
але які відсутні у Studio. Оскільки адреси студій та сертифікаційні номери президентів студій (не плутати з продюсерами) у Movie не вказані, компонентам Address та presC# буде присвоєне значення по замовчанню NULL. Запит має вигляд:
|
|
Рис.5.23. Запит INSERT з підзапитом
Розглянемо запит „з середини назовні”.
- Рядки 5, 6 генерують набір кортежів з назвами студій, які містяться у Studio.
- Рядок 4 перевіряє, чи не співпадає значення компонента StudioName з одним з цих значень.
- Запит у рядках 2-6 повертає множину назв студій, які є у Movie, але відсутні у Studio.
- Службове слово DISTINCT у рядку 2 забезпечує включення назви студії у Studio лише один раз, незалежно від кількості фільмів цієї студії у Movie.
- Рядок 1 виконує вставку назв з підзапиту у відношення Studio, компоненти Address та presC# по замовчанню заповнюються NULL.
Звернімо увагу:
Підзапит у рядках 2-6 не є корельованим, він ніяк не залежить від „основного” запиту, тому, імовірно, він виконується один раз і подальша вставка у Studio не впливає на його зміст. Однак це залежить від реалізації. Без DISTINCT запит поверне різні результати:
- Якщо вставка кортежів відкладається до завершення виконання підзапиту (рядки 2-6), запит поверне по кілька дублів студій, по числу фільмів.
- Якщо вставка кортежів виконується по мірі іх знаходження в Movie, тобто в процесі виконання підзапиту, жодний вставлений рядок не буде повторюватись.