Нетривиальное использование таблиц
С модификацией записей в базовых таблицах дело обстоит сложнее. Команды 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)