26. Добавление, изменение, удаление записей

Язык SQL ориентирован на выполнение операций над группами записей, хотя в некоторых случаях операция может проводиться и над отдельной записью. Поэтому неудивительно, что операторы добавления, изменения и удаления записей в общем случае вызывают соответствующие операции над группами записей.

ПОЯСНЕНИЕ. Все приводимые ниже операторы выполнялись в утилите InterBase WISQL. Результаты выполнения операторов также показываются в виде, возвращаемом утилитой WISQL. Следует обратить внимание на представление дат - в WISQL они показываются в строковом виде. Не стоит беспокоиться о совместимости столбцов типа дата, когда выполняются операторы INSERT, UPDATE или DELETE при посредстве компонента TQuery из приложения, написанного на Delphi. Даты InterBase в приложениях, написанных на Delphi, без проблем представляются компонентами "поле типа даты и времени" TDateTimeField и отдельными переменными типа TDateTime.

26.1. Оператор INSERT

Оператор INSERT применяется для добавления записей в объект. В качестве объекта может выступать ТБД или просмотр (VIEW), созданный оператором CREATE VIEW. В последнем случае записи могут добавляться в несколькотаблиц.

Формат оператора INSERT:

INSERT INTO <объект> [(столбец1 [, столбец2 ...])|

{VALUES (<значение1> [, <значение2> ...]) | <оператор SELECT> }

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

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

26.1.1. Явное указание списка значений

В этом случае оператор INSERT применяется для добавления одной записи и имеет формат

INSERT INTO <объект> [(столбец1 [, столбец2 ...])]

VALUES (<значение1> [, <значение2> ...])

Значения назначаются столбцам по порядку следования тех и других в операторе: первому по порядку столбцу назначается первое значение, второму столбцу - второе значение и т.д.

Пример. Добавить в таблицу ТОVARY новую запись:

INSERT INTO RASHOD (N_RASH, DAT_RASH,KOLVO, TOVAR, POKUP)

VALUES (45, "20-FEB-1997", 100, "Сахар", "Саяны, ИЧП")

Поскольку столбцы таблицы RASHOD указаны в полном составе и именно в том порядке, в котором они перечислены при создании таблицы RASHOD оператором CREATE TABLE, оператор можно упростить:

INSERT INTO RASHOD VALUES (45, "20-FEB-1997", 100, "Сахар", "Саяны, ИЧП")

Для установки уникального значения поля первичного ключа N_RASH можно воспользоваться генератором:

INSERT INTO RASHOD

VALUES (GEN_ID(RASHOD_N_RASH,2), "20-FEB-1997", 100,"Сахар", "Саяны, ИЧП")

26.1.2. Указание значений при помощи оператора SELECT

Второй формой оператора INSERT является

INSERT INTO <объект> [(столбец1 [, столбец2 ...])] <оператор SELECT>

При этом значениями, которые присваиваются столбцам, являются значения, возвращаемые оператором SELECT. Порядок их назначения столбцам аналогичен предыдущей форме оператора INSERT: значение первого по порядку столбца результирующего набора данных оператора SELECT присваивается первому столбцу оператора INSERT, второй - второму и т.д. Следует обратить внимание на важную особенность: поскольку оператор SELECT в общем случае возвращает множество записей, то и оператор INSERT в данной форме приведет к добавлению в объект аналогичного количества новых записей.

Пример. Пусть в БД определена таблица RASHOD_DATA, по составу и порядку следования полей аналогичная таблице RASHOD:

CREATE TABLE RASHOD_DATA(

N_RASH INTEGER NOT NULL,

DAT_RASH DATE NOT NULL,

KOLVO INTEGER NOT NULL,

TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

POKUP VARCHAR(20) COLLATE PXW_CYRL,

PRIMARY KEY(N_RASH)

);

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

переправляются в территориально удаленную бухгалтерию, к офису которой не успели подвести сетевые кабели (или вообще не собираются этого делать).

Тогда ежедневная выгрузка записей из таблицы RASHOD в таблицу RASHOD_DATA будет реализовываться таким оператором:

INSERT INTO RASHOD_DATA

SELECT * FROM RASHOD WHERE DAT_RASH = "20-JAN-1997"

Пусть перед выполнением данного оператора таблица RASHOD_DATA пуста. Тогда после выполнения указанного оператора она будет иметь следующее содержимое:

N_RASH

DAT_RASH

KOLVO

TOVAR

POKUP

8

20-JAN-1997

1000

Кока-кола

Адмирал, АО

7

20-JAN-1997

20

Кока-кола

<null>

6

20-JAN-1997

30

Сахар

Саяны, ИЧП

26.2..0ператор UPDATE

Оператор UPDATE применяется для изменения значения в группе записей или - в частном случае - в одной записи объекта. В качестве объекта могут выступать ТБД или просмотр, созданный оператором CREATE VIEW. В последнем случае могут изменяться значения записей из нескольких таблиц.

Формат оператора UPDATE:

UPDATE <объект>

SET столбец1 = <значение1> (,столбец2 = <значение2>...]

[WHERE <условие поиска >]

При корректировке каждому из перечисленных столбцов присваивается соответствующее значение. Корректировка выполняется для всех записей, удовлетворяющих условию поиска. Условие поиска задается так же, как в операторе SELECT.

ВНИМАНИЕ !

Если опустить WHERE <условие поиска>, в объекте будут изменены все записи.

Пример. В таблице RASHOD заменить дату на "24.01.97" и количество увеличить на 2 единицы для всех записей с датой "20.01.97":

UPDATE RASHOD

SET DAT_RASH = "24-JAN-1997", KOLVO = KOLVO + 2

WHERE DAT_RASH = "20-JAN-1997"

Содержимое таблицы RASHOD до выполнения оператора UPDATE:

NRASH

DATRASH

KOLVO

TOVAR

POKUP

5

10-JAN-1997

4000

Кока-кола

Саяны, ИЧП

1

10-JAN-1997

100

Кока-кола

Адмирал, АО

2

10-JAN-1997

20

Сахар

Лира, ТОО

3

10-JAN-1997

509

Сахар

<null>

4

10-JAN-1997

3000

Ставрида консерв

Адмирал, АО

8

20-JAN-1997

1000

Кока-кола

Адмирал, АО

7

20-JAN-1997

20

Кока-кола

<null>

6

20-JAN-1997

30

Сахар

Саяны, ИЧП

Содержимое таблицы RASHOD после выполнения оператора UPDATE:

NRASH

DATRASH

KOLVO

TOVAR

POKUP

5

10-JAN-1997

4000

Кока-кола

Саяны, ИЧП

1

10-JAN-1997

100

Кока-кола

Адмирал, АО

2

10-JAN-1997

20

Сахар

Лира, ТОО

3

10-JAN-1997

509

Сахар .

<null>

4

10-JAN-1997

3000

Ставрида консерв.

Адмирал, АО

8

24-JAN-1997

1002

Кока-кола

Адмирал, АО

7

24-JAN-1997

22

Кока-кола

<null>

6

24-JAN-1997

32

Сахар

Саяны, ИЧП

26.3. Оператор DELETE

Оператор DELETE предназначен для удаления группы записей из объекта. В качестве объекта могут выступать ТБД или просмотр, созданный оператором CREATE VIEW. В последнем случае могут удаляться записи из нескольких таблиц. В частном случае может быть удалена только одна запись.

Формат оператора DELETE:

DELETE FROM <объект> [WHERE <условие поиска>];

Удаляются все записи из объекта, удовлетворяющие условию поиска. Условие поиска задается так же, как в операторе SELECT.

ВНИМАНИЕ! Если опустить WHERE <условие поиска>, из объекта будут удалены все записи.

Пример. Удалить из таблицы RASHOD все записи о расходе товара "Кока-кола" за дату "10.01.97".

DELETE FROM RASHOD

WHERE (TOVAR = "Кока-кола") AND (DAT_RASH = "10-JAN-1997")