Иллюстрированный самоучитель по PostgreSQL

Нетривиальное использование таблиц

С модификацией записей в базовых таблицах дело обстоит сложнее. Команды UPDATE и DELETE по умолчанию работают не только с записями базовой таблицы, но и с записями всех производных таблиц, подходящих по заданному критерию. В листинге 7.14 выполняется команда UPDATE для таблицы authors. Как видно из листинга, команда также изменяет записи таблицы di stinguished_authors.

Листинг 7.14. Модификация базовых и производных таблиц.

booktown=# UPDATE authors SET firstjiame – 'Paul'
booktown-# WHERE last_name = 'Simon';
UPDATE 1
booktown=# SELECT * FROM distinguished_authors;
id | lastjiame first_name award – 25043
Simon | Paul Pulitzer Prize
(1 row)

Ключевое слово ONLY выполняет в командах UPDATE и DELETE те же функции, что и в команде SELECT – оно предотвращает каскадные модификации, продемонстрированные в листинге 7.14. Согласно правилам синтаксиса SQL ключевое слово ONLY всегда предшествует имени производной таблицы.

Пример использования ключевого слова ONLY приведен в листинге 7.15. Сначала в таблице distinginshed_authors создается запись, в которой заполняется поле award. В результате в таблице authors появляются две разные записи для одного автора. Затем старая запись (физически находящаяся в таблице authors) удаляется командой SQL DELETE с ключевым словом ONLY.

Листинг 7.15. Модификация базовых таблиц с ключевым словом ONLY.

booktown=# INSERT INTO distinguished_authors
booktown-* VALUES (1809. 'Geisel'.
booktown(# 'Theodor Seuss', 'Pulitzer Prize');
INSERT 3629488 1
booktown=# SELECT * FROM authors
booktown-# WHERE lastjname = 'Geisel':
id | lastjname | firstjiame
1809 | Geisel | Theodor Seuss 1809 | Geisel |
Theodor Seuss
(2 rows)
booktown=# DELETE FROM ONLY authors
booktown-# WHERE lastjiame = 'Geisel';
DELETE 1

В итоге после выполнения листинга 7.15 запись появляется в таблице distinguished_authors и удаляется из таблицы authors:

booktown=# SELECT * FROM authors
booktown-# WHERE lastjiame = 'Geisel':
id | lastjiame | firstjiame
1809 Geisel | Theodor Seuss
(1 row)

booktown=# SELECT * FROM distinguishedjauthors
booktown-# WHERE lastjiame = 'Geisel1;
id | lastjiame | firstjiame | award
1809 | Geisel | Theodor Seuss | Pulitzer Prize
(1 row)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.