Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы базы Данных / Базы данных / Введение в модель данных SQL.doc
Скачиваний:
83
Добавлен:
22.03.2015
Размер:
1.93 Mб
Скачать

Вставка всех строк указанной таблицы

Тем самым, стандарт допускает вставку в указанную таблицу всех строк некоторой другой таблицы (вариант table_name). Эта другая таблица может быть как базовой, так и представляемой. Естественно, что в последнем случае в определении представления не должны присутствовать ссылки на таблицу, в которую производится вставка. При использовании данного варианта оператора вставки число столбцов вставляемой таблицы должно совпадать с числом столбцов таблицы, в которую производится вставка, или с числом столбцов, указанных в списке column_commalist, если этот список задан. Типы данных соответствующих столбцов вставляемой таблицы и таблицы, в которую производится вставка, должны быть совместимыми. Если в операции задан список column_commalist и в нем содержатся не все имена столбцов таблицы, в которую производится вставка, то в оставшиеся столбцы во всех строках заносятся значения столбцов по умолчанию. Если для какого-либо из оставшихся столбцов значение по умолчанию не определено, при выполнении операции вставки фиксируется ошибка.

Чтобы привести пример этого варианта операции INSERT (пример 17.1), предположим, что в базе данных EMP-DEPT-PRO имеется еще одна промежуточная таблица EMP_TEMP, в которой временно хранятся данные о служащих, проходящих испытательный срок. Пусть эта таблица имеет следующий заголовок:

EMP_TEMP:

EMP_NO : EMP_NO

EMP_NAME : VARCHAR

EMP_BDATE : DATE

В таблице EMP_TEMP хранятся не полные сведения о служащих, а именно те, которые требуются на время испытательного срока. Если выполнить операцию

INSERT INTO EMP (EMP_NO, EMP_NAME, EMP_BDATE) TABLE EMP_TEMP;

Пример 17.1. (html, txt)

то в основной таблице EMP появятся строки, соответствующие сотрудникам, проходившим испытательный срок. При этом в столбцах EMP_NO, EMP_NAME, EMP_BDATE этих строк будут содержаться данные, взятые из таблицы EMP_TEMP, а в столбцах EMP_SAL, DEPT_NO, PRO_NO будут находиться значения, определенные для данных столбцов по умолчанию. Конечно, поскольку столбец EMP_NO является первичным ключом таблицы EMP (по всей видимости, и таблицы EMP_TEMP), операция вставки будет успешно выполнена только в том случае, когда ограничение первичного ключа таблицы EMP не будет нарушено (конечно же, требуется выполнение и всех других ограничений целостности, определенных для таблицы EMP).

Вставка явно заданного набора строк

Теперь обратимся к варианту оператора INSERT, в котором набор вставляемых строк задается явно с использованием синтаксической конструкции table_value_constructor. Напомним синтаксические правила, определяющие эту конструкцию:

table_value_constructor ::=

VALUES row_value_constructor_comma_list

row_value_constructor ::= row_value_constructor_element

| [ ROW ] (row_value_constructor_element_comma_list)

| row_subquery

row_value_constructor_element ::= value_expression

| NULL | DEFAULT

Самый простой пример использования этого варианта оператора вставки состоит в занесении в таблицу EMP явно задаваемых данных о новом сотруднике (пример 17.2):

INSERT INTO EMP

ROW (2445, 'Brown', '1985-04-08', 16500.00, 630, 772);

Пример 17.2. (html, txt)

В этом примере явно заданы значения всех столбцов заносимой строки (как показывают синтаксические правила, ключевое слово ROW можно опустить). Возможен и такой вариант (пример 17.2a):

INSERT INTO EMP

ROW ( 2445, DEFAULT, NULL, DEFAULT, NULL, NULL);

Пример 17.2a. (html, txt)

В этом случае мы знаем о новом служащем очень мало, но уверены в том, что его имя и размер заработной платы должны быть назначены по умолчанию, а про дату рождения, номер отдела и номер проекта ничего не известно. Обратите внимание, что выполнение подобной операции не нарушает ограничения целостности таблицы EMP.

Если обладать полной информацией об определении таблицы EMP, то формулировку операции примера 17.2a можно переписать короче следующим эквивалентным образом (пример 17.2b):

INSERT INTO EMP (EMP_NO) 2445;

Пример 17.2b. (html, txt)

Вспомним теперь, что одной из разновидностей value_expression_primary является scalar_subquery (см. раздел "Скалярные выражения" лекции 13). Это означает, что в список элементов конструктора строки могут входить скалярные запросы, т. е. запросы, результат выполнения которых состоит из единственной строки, включающей единственный столбец. Поэтому допустима, например, такая операция вставки (пример 17.3):

INSERT INTO EMP VALUES

ROW (2445, (SELECT EMP_NAME

FROM EMP

WHERE EMP_NO = 2555),

'1985-04-08',

SELECT EMP_SAL

FROM EMP

WHERE EMP_NO = 2555),

NULL, NULL ),

ROW (2446, (SELECT EMP_NAME

FROM EMP

WHERE EMP_NO = 2556),

'1978-05-09',

(SELECT EMP_SAL

FROM EMP

WHERE EMP_NO = 2556),

NULL, NULL );

Пример 17.3. (html, txt)

После выполнения этой операции в таблице EMP появятся две новые строки для сотрудников с уникальными идентификаторами 2445 и 2446, причем первому из них будет присвоено имя и размер заработной платы сотрудника с уникальным идентификатором 2555, а второму - аналогичные данные о сотруднике с уникальным идентификатором 2556.

Соседние файлы в папке Базы данных