Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции О_о DataBase.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
8.68 Mб
Скачать
    1. Манипулирование данными

Дополнительные возможности INSERT

В общем случае, предложение INSERT может быть представлено следующим образом:

INSERT INTO объект [(имя_колонки, …)] вставляемые_значения

Вставляемые значения указываются одним из двух способов:

VALUES (значение, …), (…), …

или

запрос

В качестве объекта, кроме имени таблицы, что было рассмотрено ранее, могут быть указаны имя представления (VIEW) или непосредственно запрос:

INSERT INTO имя_view [(имя_колонки, …)] вставляемые_значения

INSERT INTO (запрос) [(имя_колонки, …)] вставляемые_значения

Если в качестве объекта в предложении указано представление, для которого определен триггер INSTEAD OF INSERT, при выполнении предложения выполняется соответствующий триггер.

Если триггер INSTEAD OF INSERT для представления не определен, значение не может быть вставлено в колонку представления, которая получена из константы, выражения или скалярной функции, или из колонки базовой таблицы, используемой и для других колонок представления.

Если объектом операции вставки является представление с такими колонками, в предложении INSERT должен быть указан явно список имен колонок, в котором отсутствуют подобные колонки.

Вставляемые значения могут быть вставлены в объект, заданный в виде представления или запроса, в которых использована операция UNION ALL, если эти значения удовлетворяют ограничениям CHECK только одной базовой таблицы. Если значения удовлетворяют ограничениям CHECK нескольких таблиц или не удовлетворяют ни одному ограничению, возвращается ошибка.

Если в качестве объекта в предложении INSERT указан запрос, он должен допускать возможность выполнения операции вставки и должен удовлетворять тем же требованиям, которые предъявляются к модифицируемым представлениям, приведенным в описании предложения CREATE VIEW (см. ниже).

Использование представлений

Представления создаются с помощью предложения CREATE VIEW, имеющего следующий формат:

CREATE VIEW имя_представления [ ( список_колонок ) ]

AS [ WITH табличное_выражение ] запрос

[ WITH [ тип ] CHECK OPTION ]

Тип задается одним из двух способов: CASCADED или LOCAL

Описание:

Имя представления – называет представление в соответствии с обычными правилами именования объектов в DB2.

Список колонок – определяет имена колонок в представлении. Если указан, должен называть каждую колонку, получаемую в результате выполнения запроса. Если список колонок не указан, имена колонок представления определяются именами колонок, полученными в результате выполнения запроса. В этом случае запрос должен включать, при необходимости, конструкции AS в списке для указания имени колонки. Например, следующие два определения представления дадут одинаковый результат:

CREATE VIEW V1

AS

SELECT EMPID, LASTNAME, SALARY + BONUS + COMM AS COMMON_PAY

FROM EMPLOYEE

и

CREATE VIEW V1 (EMPID, LASTNAME, COMMON_PAY)

AS

SELECT EMPID, LASTNAME, SALARY + BONUS + COMM

FROM EMPLOYEE

Запрос определяет получаемое представление и может быть представлен в виде одного запроса или нескольких запросов, объединенных операцией UNION ALL (из теоретико-множественных операций при определении представления допускается использование только операции UNION ALL). В каждый момент при обращении к представлению оно содержит строки, получаемые при выполнении запроса.

Представления создаются на основе таблиц, других представлений или соединении таблиц с другими таблицами и/или представлениями. Определим таблицы и представления, на основе которых создается представление, как базовые.

Представления могут быть определены как не модифицируемые (read-only) или модифицируемые.

Представления являются не модифицируемыми, если справедливо хотя бы одно из следующих условий:

  • первая конструкция FROM в определении представления содержит более одного имени таблицы или представления, т.е. представление соединяет несколько таблиц и/или представлений;

  • в первой конструкции SELECT указано ключевое слово DISTINCT, т.е. в представление включается только одна из нескольких одинаковых строк;

  • в первой конструкции SELECT в списке выбора указана агрегатная функция, т.е. колонка логической таблицы, описанной представлением, создается с помощью агрегатной функции.

  • внешний подзапрос содержит конструкцию GROUP BY, т.е. строки логической таблицы, описанной представлением, могут быть получены из нескольких строк базовой таблицы или представления, а не из одной строки.

  • представление содержит подзапрос, такой, что базовый объект внешнего запроса и подзапроса – одна и та же таблица. Это значит, что таблица или представление, из которых создаваемое представление извлекает данные, также используются для определения строк, которые должны быть выбраны;

  • в первой конструкции FROM указано не модифицируемое представление, т.е. представление строится на основе read-only представления.

Не модифицируемое представление не может быть объектом в предложениях INSERT, DELETE, UPDATE. Модифицируемое представление может указываться в предложениях DELETE, INSERT и UPDATE. В этом случае соответствующая операция выполняется с базовой таблицей, на которой определено представление.

Конструкция WITH CHECK OPTION может быть указана только для модифицируемых представлений. В этом случае каждая вставляемая или обновляемая с помощью представления строка должна удовлетворять определению представления, т.е. для нее должны выполняться все условия отбора, указанные в определении представления в конструкциях WHERE. Если данная конструкция опущена, условия, указанные в определении представления проверяться не будут.

Например, пусть имеется таблица T1 с колонками TId типа INT и TName типа VARCHAR(20), и для нее определено следующее представление:

CREATE VIEW V1

AS

SELECT * FROM T1 WHERE TName LIKE 'A%'

WITH CHECK OPTION

Выполняются следующие два предложения:

INSERT INTO V1 VALUES(12, 'ABC')

и

INSERT INTO V1 VALUES(12, 'BCC')

В этом случае первое предложение будет выполнено успешно, и в таблицу T1 будет вставлена новая строка, тогда как второе предложение завершится с ошибкой, и новые данные в таблицу Т1 вставлены не будут.

Если же представление V1 для данной таблицы будет определено без указания WITH CHECK OPTION:

CREATE VIEW V1

AS

SELECT * FROM T1 WHERE TName LIKE 'A%'

Тогда оба приведенных выше предложения INSERT выполнятся успешно, но строку, вставленную с помощью второго предложения INSERT, нельзя будет получить, используя представление V1.

В определении представления могут быть использованы другие (вложенные) представления, каждое из которых может использовать конструкцию WHERE. Тип, указанный в конструкции WITH CHECK OPTION, указывает, наследует ли представление все условия отбора от вложенных представлений или нет. Если указано CASCADED или ничего не указано, тогда для вставляемых и/или обновляемых записей проверяются все условия отбора. Например, если определено следующее представление:

CREATE VIEW V2

AS

SELECT * FROM V1 WHERE TId > 25

WITH CHECK OPTION -- или WITH CASCADED CHECK OPTION

И рассматриваются следующие три предложения INSERT:

INSERT INTO V2 VALUES(32, 'ABC')

INSERT INTO V2 VALUES(12, 'ABC')

INSERT INTO V2 VALUES(32, 'BBC')

Тогда первое предложение будет выполнено успешно, тогда как второе и третье выполнены не будут. Во втором предложении нарушено условие отбора, указанное в определении V2, а в третьем – условие отбора, указанное во вложенном представлении V1.

Если в качестве типа указано LOCAL, тогда условия отбора, указанные во вложенных представлениях, не проверяются. Например, если представление V2 определено следующим образом:

CREATE VIEW V2

AS

SELECT * FROM М1 WHERE TId > 25

WITH LOCAL CHECK OPTION

И рассматриваются те же три предложения INSERT, тогда не будет выполнено только второе предложение, в котором нарушено (локальное) условие отбора, указанное в определении представления V2. В этом случае данные, вставленные в таблицу с помощью третьего предложения INSERT, нельзя будет получить, используя представление V2.

Модифицируемые представления могут накладывать ограничения на то, какие колонки представления могут обновляться. Например, представление, в котором содержатся вычисляемые данные, не могут использоваться для обновления таких вычисляемых данных (например, в таблице есть год рождения, а представление вычисляет возраст сотрудника).

Когда представление используется для вставки строк в таблицу, в определении представления должны быть указаны все обязательные колонки базовой таблицы (т.е. колонки, для которых не допускаются null значения и для которых не определены значения по умолчанию). Вставляемая строка должна предоставлять значения для всех таких колонок.

Если представление используется для обновления, можно обновлять только те колонки, которые включены в определение представления. Нельзя обновлять вычисляемые колонки, даже если они включены в представление.

Если выполняется операция удаления для представления, удаляются одна или несколько строк базовой таблицы целиком, а не только та часть строки таблицы, которая видна через представление.

Модифицируемое представление является объектом для ссылочных ограничений и проверки других ограничений в таблице, на которой данное представление, в конечном счете, базируется.

Как говорилось, в определении представления из теоретико-множественных операций может быть использована только операция UNION ALL. Представления, в определении которых используется операция UNION ALL, также могут быть модифицируемыми. В этом случае в двух запросах, объединяемых операцией UNION ALL, должны использоваться разные таблицы. Кроме того, следует обратить внимание на то, как проверяются ограничения целостности, использованные в определении таблиц.

Рассмотрим примеры.

Пример 1. Пусть определены две таблицы, имеющие одинаковую структуру:

CREATE TABLE EMP1 (

EmpNo CHAR(6) NOT NULL CHECK(EmpNo > ' '),

LastName VARCHAR(20),

WorkDept CHAR(3)

)

и

CREATE TABLE EMP2 (

EmpNo CHAR(6) NOT NULL CHECK(EmpNo = ' '),

LastName VARCHAR(20),

WorkDept CHAR(3)

)

На основе этих таблиц создается представление:

CREATE VIEW CEMP(EmpNo, LastName, WorkDept) AS

SELECT * FROM EMP1

UNION ALL

SELECT * FROM EMP2

Если теперь выполняется следующая операция вставки:

INSERT INTO CEMP VALUES (' ', 'NewDept', 'D99'),

('000099', 'Miller', 'D99')

Первая строка будет вставлена в таблицу EMP2, так как для нее выполняется ограничение этой таблицы, а вторая строка – в таблицу EMP1.

Пример 2. Пусть определен следующий фрагмент схемы:

T1(id1, …)

T2(id2, …)

T3(…, id1(FK1), id2(FK2), …)

Отношения Т1 и Т2 имеют одинаковую схему отношения (совместимы по объединению).

Созданы таблицы Т1, Т2, Т3, соответствующие приведенному фрагменту схемы.

На базовых таблицах T1 и T2 определяется представление:

CREATE VIEW V1(ID) AS

SELECT * FROM T1

UNION ALL

SELECT * FROM T2

Выполняется предложение DELETE FROM V1

Вариант 1. Пусть при определении таблицы T3 для внешнего ключа, ссылающегося на таблицу Т1, определено правило удаления RESTRICT. Тогда, если в Т1 есть строки, на которые ссылаются из Т3, удаление не будет выполнено.

Вариант 2. Пусть при определении таблицы Т3 для внешнего ключа, ссылающегося на таблицу Т1, определено правило удаления NO ACTION, а для внешнего ключа, ссылающегося на таблицу Т2, определено правило удаления CASCADE. Строки из Т3 могут быть удалены по правилу CASCADE при удалении строк из Т2, после чего удаление может завершиться успешно (NO ACTION проверяет после выполнения операции).

Например, в таблицах имеются следующие данные:

Т1

Id1

T2

Id2

V1

Id

1

1

1

2

4

2

3

5

3

1

T3

Id1

Id2

4

1

4

5

2

1

Вариант 1. Правило удаления RESTRICT: в Т3 есть ссылка на Т1, удаление выполнено не будет

Вариант 2. Правило удаления NO ACTION: удалится из V1, для Т2 – удалятся строки из Т3, после чего успешно выполнится операция удаления и из T1.