Similar presentations:
Представления. Как создается представление
1. Представления
1Представления
2.
21. Что такое представление?
2. Как создается представление?
3. Где и когда используются?
4. Как используются?
5. Возможности изменения представления.
6. Виды представлений.
7. Обновляемые представления. Связь изменений данных в представлениях и в базовых таблицах.
8. Использование триггеров для изменения данных через изменение представлений.
3. 1. Что такое представление?
Представление VIEW– это именованный хранимый запрос в
базе данных.
Изучается в разделе языка SQL / Запросы
3
Представление VIEW
– это объект базы данных, виртуальная
таблица
(содержимое представления
специфицируется запросом –
оператором SELECT и обычно не хранится
в базе данных.
Изучается в разделе Определение данных
/ Домены, Таблицы, Индексы, Представления
Хранится
СУБД MySQL в папке DATA вместе с базовыми таблицами.
4. 2. Как создается представление?
SQL синтаксис создания VIEW в базах данных SQLite4
Используем CREATE для создания VIEW – это такой же объект базы данных, как и таблица.
Указываем, что хотим создать представление при помощи ключевого слова VIEW.
Представление может быть временным, поэтому после ключевого слова CREATE вы можете
использовать слово TEMP или TEMPORARY.
Если вы не уверены, что создаете представление с уникальным именем и не хотите
возникновения ошибок при создании VIEW в базе данных, то можете использовать ключевую
фразу IF NOT EXISTS.
5. 2. Как создается представление?
SQL синтаксис создания VIEW в базах данных SQLiteДалее вам необходимо указать имя представления, которое должно быть
уникальным, в качестве имени можно использовать квалификатор, в том случае,
если вы работаете с несколькими базами данных и хотите быть уверенным в том,
что создаете VIEW для нужной базы данных.
После имени представления идет ключевое слово AS и запрос SELECT, который
будет храниться в файле базы данных SQLite и к которому SQLite будет обращаться
по тому имени, которое вы указали при создании VIEW.
5
6.
SQL синтаксис удаления VIEW из базы данных подуправлением SQLite3
6
7. 2. Как создается представление?
7СУБД MySQL
CREATE [OR REPLACE][ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)] AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
view_name — имя создаваемого представления;
select_statement — оператор SELECT, выбирающий данные из таблиц и/или других представлений,
которые будут содержаться в представлении.
8. 2. Как создается представление?
8СУБД MySQL
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)] AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
4 необязательные конструкции:
OR REPLACE — при использовании данной конструкции в случае существования представления с таким
именем старое будет удалено, а новое создано.
В противном случае возникнет ошибка, информирующая о существовании представления с таким именем и
новое представление создано не будет.
Следует отметить одну особенность — имена таблиц и представлений в рамках одной базы данных должны
быть уникальны, т.е. нельзя создать представление с именем уже существующей таблицы.
Однако конструкция OR REPLACE действует только на представления и замещать таблицу не будет.
9. 2. Как создается представление?
CREATE [OR REPLACE][ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]9
VIEW view_name [(column_list)] AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
column_list — задает имена полей представления.
1) Имена полей представления должны быть уникальны:
CREATE VIEW v (a_id, b_id) AS SELECT a.id, b.id FROM a,b;
или
CREATE VIEW v AS SELECT a.id a_id, b.id b_id FROM a,b;
2) вычисляемые поля представлений должны иметь имена:
CREATE VIEW vendor_cost (cost) AS SELECT name, price*quantity
FROM venders natural join incoming natural join magazine_incoming natural join prices; (MySQL)
или
CREATE VIEW vendor_cost AS SELECT name, price* quantity as cost
FROM venders natural join incoming natural join magazine_incoming natural join prices; (MySQL)
10. 2. Как создается представление?
10CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)] AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
ALGORITM — определяет алгоритм, используемый при обращении к представлению.
Select <> from view_name
Существует два алгоритма, используемых MySQL при обращении к представлению: MERGE и TEMPTABLE.
Алгоритм MERGE: MySQL при обращении к представлению добавляет в использующийся оператор
соответствующие части из определения представления и выполняет получившийся оператор над базовой
таблицей.
Алгоритм TEMPTABLE: MySQL заносит содержимое представления во временную таблицу, над которой затем
выполняется оператор обращенный к представлению.
UNDEFINED: MySQL сама выбирает какой алгоритм использовать при обращении к представлению. Это
значение по умолчанию, если данная конструкция отсутствует.
11. 2. Как создается представление?
Алгоритм MERGE: MySQL при обращении кпредставлению добавляет в использующийся
оператор соответствующие части из
определения представления и выполняет
получившийся оператор над базовой
таблицей.
Использование алгоритма MERGE требует
соответствия 1 к 1 между строками таблицы и
основанного на ней представления.
Пример: представление выбирает отношение
числа просмотров к числу ответов для тем
форума.
11
CREATE VIEW v AS
SELECT subject, num_views/num_replies AS param
FROM topics
WHERE num_replies>0;
SELECT subject, param
FROM v
WHERE param>1000;
В случае MERGE алгоритма MySQL включает
определение представления в использующийся
оператор SELECT: заменяет имя представления на имя
таблицы, заменяет список полей на определения полей
представления и добавляет условие в части WHERE с
помощью оператора AND.
Итоговый оператор, выполняемый затем MySQL, выглядит
следующим образом:
Для данного представления каждая строка
соответствует единственной строке из таблицы
topics, т. е. может быть использован алгоритм
SELECT subject, num_views / num_replies AS param
MERGE.
FROM topics
WHERE num_replies>0 AND num_views / num_replies>1000;
12. 2. Как создается представление?
ALGORITM — определяет алгоритм, используемыйпри обращении к представлению.
Алгоритм TEMPTABLE: MySQL заносит содержимое
представления во временную таблицу, над которой
затем выполняется оператор обращенный к
представлению.
Если в определении представления используются
групповые функции (count, max, avg, group_concat и т.
д.), подзапросы в части перечисления полей или
конструкции DISTINCT, GROUP BY, то не выполняется
требуемое алгоритмом MERGE соответствие 1 к 1
между строками таблицы и основанного на ней
представления.
Пусть наше представление выбирает количество тем
для каждого форума.
12
CREATE VIEW v
AS SELECT forum_id, count(*) AS num
FROM topics
GROUP BY forum_id;
Найдем максимальное количество тем в
форуме:
SELECT MAX(num)
FROM v;
Если бы использовался алгоритм MERGE,
то этот запрос был бы преобразован.
SELECT MAX(count(*))
FROM topics
GROUP BY forum_id;
ERROR 1111 (HY000): Invalid USE of GROUP function,
используется недопустимая вложенность
групповых функций.
13. 2. Как создается представление?
13ALGORITM — определяет алгоритм, используемый
при обращении к представлению.
Алгоритм TEMPTABLE: MySQL заносит содержимое
представления во временную таблицу, над которой
затем выполняется оператор обращенный к
представлению.
Алгоритм TEMPTABLE
• заносит содержимое представления во временную
таблицу (данный процесс иногда называют
«материализацией представления»),
• вычисляет MAX() используя данные временной
таблицы,
• удаляет временную таблицу.
Пусть наше представление выбирает количество тем
для каждого форума.
CREATE VIEW v AS
SELECT forum_id, count(*) AS num
FROM topics
GROUP BY forum_id;
Найдем максимальное количество тем в
форуме:
SELECT MAX(num)
FROM v;
CREATE TEMPORARY TABLE tmp_table
SELECT forum_id, count(*) AS num
FROM topics
GROUP BY forum_id;
SELECT MAX(num) FROM tmp_table;
DROP TABLE tmp_table;
14. 2. Как создается представление?
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]14
VIEW view_name [(column_list)] AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
ALGORITM — определяет алгоритм, используемый при обращении к представлению.
UNDEFINED:
MySQL сама выбирает какой алгоритм использовать при обращении к представлению. Это значение по
умолчанию, если данная конструкция отсутствует.
Итог:
нет серьезных причин явно указывать алгоритм при создании представления, так как:
В случае UNDEFINED MySQL пытается использовать MERGE везде, где это возможно, так как он более
эффективен, чем TEMPTABLE и, в отличие от него, не делает представление не обновляемым.
Если явно указан алгоритм MERGE, а определение представления содержит конструкции запрещающие
его использование, то MySQL выдаст предупреждение и установит значение UNDEFIND.
15. 2. Как создается представление?
15CREATE [OR REPLACE][ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)] AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
WITH CHECK OPTION (с опцией проверки) — при использовании данной конструкции все добавляемые или
изменяемые строки будут проверяться на соответствие определению представления.
В случае несоответствия данное изменение не будет выполнено.
Обратите внимание, что при указании данной конструкции для необновляемого представления возникнет
ошибка и представление не будет создано.
16. 3. Где и когда используются?
Представление может стать дополнительным элементом защиты БДили инструментом создания внешних схем:
1) Можно скрыть части таблиц БД.
2) Любые манипуляции с представлениями, доступными только для чтения,
не способны навредить реальным данным.
Представление может стать инструментарием ,
• упрощающим доступ к данным,
• ускоряющим разработку проекта БД
• и снижающим трудозатраты при перестройке структуры БД.
Пример
Клиентские приложения обращаются к определенному срезу данных, формируя
динамические запросы не напрямую к базовым таблицам, а к представлениям.
При необходимости изменить правила выборки данных достаточно внести изменения
в код представления, расположенном на стороне сервера.
Представления упрощают схему данных. Можно заменить уровень схемы более
наглядным слоем не столь многочисленных представлений.
16
17. 4. Как используются?
- для изменения структуры и формата данных;- для определения сложных или часто встречающихся подзапросов
(представления можно рассматривать как некоторый аналог
процедур или функций в императивных языках программирования).
17
18. 5. Возможности изменения представления.
1 способ: для изменения запроса представления используйте командуCREATE OR REPLACE VIEW.
2 способ: удалить представление DROP VIEW ИМЯ_ПРЕДСТАВЛЕНИЯ и снова создать.
3 способ: использование конструкции ALTER VIEW
СУБД MySQL:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = {user | CURRENT_USER}]
[SQL SECURITY {DEFINER | INVOKER}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
18
19. 5. Возможности изменения представления.
191 способ: для изменения запроса представления используйте команду
CREATE OR REPLACE VIEW.
2 способ: удалить представление DROP VIEW ИМЯ_ПРЕДСТАВЛЕНИЯ; и снова создать.
3 способ: использование конструкции ALTER VIEW
СУБД PostgreSQL:
ALTER VIEW [ IF EXISTS ] имя ALTER [ COLUMN ] имя_столбца SET DEFAULT выражение
ALTER VIEW [ IF EXISTS ] имя ALTER [ COLUMN ] имя_столбца DROP DEFAULT
ALTER VIEW [ IF EXISTS ] имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER VIEW [ IF EXISTS ] имя RENAME TO новое_имя
ALTER VIEW [ IF EXISTS ] имя SET SCHEMA новая_схема
ALTER VIEW [ IF EXISTS ] имя SET ( имя_параметра_представления [=
значение_параметра_представления] [, ... ] )
ALTER VIEW [ IF EXISTS ] имя RESET ( имя_параметра_представления [, ... ] )
20. 5. Возможности изменения представления.
СУБД PostgreSQL:ALTER VIEW изменяет различные дополнительные свойства представления.20
ALTER VIEW [ IF EXISTS ] имя ALTER [ COLUMN ] имя_столбца SET DEFAULT выражение
ALTER VIEW [ IF EXISTS ] имя ALTER [ COLUMN ] имя_столбца DROP DEFAULT
ALTER VIEW [ IF EXISTS ] имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER VIEW [ IF EXISTS ] имя RENAME TO новое_имя
ALTER VIEW [ IF EXISTS ] имя SET SCHEMA новая_схема
ALTER VIEW [ IF EXISTS ] имя SET ( имя_параметра_представления [=
значение_параметра_представления] [, ... ] )
ALTER VIEW [ IF EXISTS ] имя RESET ( имя_параметра_представления [, ... ] )
21. 5. Возможности изменения представления.
Примеры:1) ALTER VIEW v1 RENAME TO v2;
2) CREATE TABLE base_table (id int, ts timestamp);
CREATE VIEW a_view AS SELECT * FROM base_table;
ALTER VIEW a_view ALTER COLUMN ts SET DEFAULT now();
INSERT INTO base_table(id) VALUES(1); -- в ts окажется значение NULL
INSERT INTO a_view(id) VALUES(2); -- в ts окажется текущее время
21
22.
6. Виды представлений и ограничения при описаниизапроса SELECT для определения представлений
22
Горизонтальное п.- подмножество записей из таблицы БД, отвечающее определённым
условиям.
Вертикальное п. - подмножество столбцов таблицы БД, требуемое программой.
Объединенное п. - результат соединения (join) нескольких таблиц.
Сгруппированное п. - результат группировки записей в таблице.
Результат обработки данных таблицы определёнными операциями (например,
представление может содержать все данные реальной таблицы, но с приведением строк
в верхний регистр и обрезанными начальными и концевыми пробелами).
Результат слияния нескольких таблиц с одинаковыми именами и типами полей, когда в
представление попадают все записи каждой из сливаемых таблиц (возможно, с
исключением дублирования).
Запрещено использовать операторы
UNION, EXCEPT, INTERSECT, GROUP BY (в mysql допустимо),ORDER BY, HAVING,
DISTINCT.
Оператор SELECT * …., если предполагается вывод одноименных атрибутов из
нескольких таблиц, НЕДОПУСТИМ. Требуется использование псевдонимов.
23. 6. Модифицируемые представления
В проектах БД большинство представлений доступно только для чтения.Автоматически представление доступно только для чтения,
если оно обладает хотя бы одной из перечисленных ниже характеристик:
1) представление построено на базе двух и более таблиц или представлений;
2) при описании представления используется подзапросы;
3) представление содержит выражения;
4) используется оператор группировки group by;
5) используется любая из агрегатных функций;
6) задействуются квантификаторы DISTINCT;
7) задействуются спецификаторы UNION или UNION ALL;
8) множественные ссылки на любой столбец базовой таблицы.
23
24. 6. Модифицируемые представления
24Допускают редактирование данных представления, отвечающие
следующим критериям:
1) представление должно обращаться только к одной таблице и возвращать все столбцы,
требующие обязательного ввода значений;
2) представление обращается к другому представлению, допускающему модификацию данных;
3) в представлении отсутствуют столбцы с одинаковыми именами;
4) в представлении нет вычисляемых (искусственных) столбцов;
5) в представлении отсутствуют все черты немодифицируемых представлений.
25. 6. Модифицируемые представления
25Представление называется обновляемым, если к нему могут быть применимы операторы UPDATE и DELETE для
изменения данных в таблицах, на которых основано представление.
Для того, чтобы представление было обновляемым должно быть выполнено два условия:
1) соответствие 1 к 1 между строками представления и таблиц, на которых основано представление,
т.е. каждой строке представления должно соответствовать по одной строке в таблицах-источниках.
2) поля представления должны быть простым перечислением полей таблиц, а не выражениями col1/col2
или col1+2.
Особое мнение: встречающиеся в русско-язычной литературе требования, чтобы обновляемое
представление было основано на единственной таблице и присутствие в числе полей представления
первичного ключа физической таблицы не являются необходимыми.
Скорее всего требование единственной таблицы является ошибкой перевода.
Дело в том, что через представление, основанное на нескольких таблицах, может обновлять только
одну таблицу за запрос, т.е. конструкция SET оператора UPDATE должна перечислять колонки только
одной таблицы из определения представления.
Кроме того, чтобы представление, основанное на нескольких таблицах, было обновляемым, таблицы в
его определении должны быть соединены только с помощью INNER JOIN, а не OUTER JOIN, и не
используется объединение UNION.
26. 6. Модифицируемые представления
Какое из этих представлений - модифицируемое ?#1 CREATE VIEW Dailyorders AS
SELECT DISTINCT cnum, snum, onum, odate
FROM Orders;
#2 CREATE VIEW Custotals AS
SELECT cname, SUM (amt)
FROM Orders, Customers
WHERE Orders.cnum = customer.cnum
GROUP BY cname;
#3 CREATE VIEW Thirdorders AS
SELECT *
FROM Dailyorders
WHERE odate = 10/03/1990;
26
27. 6. Модифицируемые представления
Какое из этих представлений - модифицируемое ?#4 CREATE VIEW Nullcities AS
SELECT snum, sname, city
FROM Salespeople
WHERE city IS NULL OR sname BETWEEN 'A' AND
'MZ';
#5 Create view V_test(ID,NAME) as
SELECT ID, NAME
FROM TEST
ORDER BY NAME
#6 CREATE VIEW empl_vu AS
SELECT * FROM employee
WHERE sal > 10000
WITH READ ONLY;
27
28. 6. Модифицируемые представления
28Обновляемое представление может допускать добавление данных (INSERT),
если все поля таблицы-источника, не присутствующие в представлении, имеют
значения по умолчанию.
Обратите внимание: для представлений, основанных на нескольких таблицах,
операция добавления данных (INSERT) работает только в случае, если происходит
добавление в единственную реальную таблицу.
Удаление данных (DELETE) для таких представлений, основанных на нескольких
таблицах, не поддерживается.
29. 6. Модифицируемые представления
СУБД MySQL29
CREATE [OR REPLACE][ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)] AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
При использовании в определении представления конструкции
WITH [CASCADED | LOCAL] CHECK OPTION
все добавляемые или изменяемые строки будут проверяться на соответствие определению
представления.
Изменение данных (UPDATE) будет происходить только, если строка с новыми значениями удовлетворяет
условию WHERE в определении представления.
Добавление данных (INSERT) будет происходить только, если новая строка удовлетворяет условию WHERE в
определении представления.
Иными словами, нельзя добавить или изменить данные в представлении таким образом, чтобы они не
были доступны через представление.
Ключевые слова CASCADED и LOCAL определяют глубину проверки для представлений основанных на
других представлениях:
Для LOCAL происходит проверка условия WHERE только в собственном определении представления.
Для CASCADED происходит проверка для всех представлений, на которых основано данное
представление. Значением по умолчанию является CASCADED.
30. 6. Модифицируемые представления
Рассмотрим пример обновляемого представления, основанного на двух таблицах.Пусть наше представление выбирает темы форума с числом просмотров более 2000.
30
CREATE OR REPLACE VIEW v AS
SELECT forum_name, subject, num_views
FROM topics,forums f
WHERE forum_id=f.id AND num_views>2000
WITH CHECK OPTION;
UPDATE v SET num_views=2003 WHERE subject='test';
SELECT * FROM v WHERE subject='test';
+------------+---------+-----------+
| forum_name | subject | num_views |
+------------+---------+-----------+
| Новости
| test
| 3000 |
+------------+---------+-----------+
SELECT * FROM v WHERE subject='test';
+------------+---------+-----------+
| forum_name | subject | num_views |
+------------+---------+-----------+
| Новости
| test
| 2003 |
+------------+---------+-----------+
SELECT subject,num_views
FROM topics WHERE subject='test';
+---------+-----------+
| subject | num_views |
+---------+-----------+
| test
| 2003
|
+---------+-----------+
31. 6. Модифицируемые представления
Рассмотрим пример обновляемого представления, основанного на двух таблицах.Пусть наше представление выбирает темы форума с числом просмотров более 2000.
CREATE OR REPLACE VIEW v AS
SELECT forum_name, subject, num_views
FROM topics,forums f
WHERE forum_id=f.id AND num_views>2000
WITH CHECK OPTION;
31
UPDATE v SET num_views=1999 WHERE subject='test';
ERROR 1369 (HY000): CHECK OPTION failed 'v'
32. 6. Модифицируемые представления
Рассмотрим пример обновляемого представления, основанного на двух таблицах.Пусть наше представление выбирает темы форума с числом просмотров более 2000.
CREATE OR REPLACE VIEW v AS
SELECT forum_name, subject, num_views
FROM topics,forums f
WHERE forum_id=f.id AND num_views>2000
WITH CHECK OPTION;
INSERT INTO v
(forum_name) VALUES('TEST');
32
INSERT INTO v (subject, num_views) VALUES('test1',4000);
ERROR 1369 (HY000): CHECK OPTION failed 'v'
Причина в том, что значением по умолчанию
колонки forum_id является 0, поэтому
добавляемая строка не удовлетворяет условию
WHERE forum_id=f.id в определении представления.
INSERT INTO v
(forum_id,subject,num_views) VALUES(1,'test1',4000);
ERROR 1054
(42S22): Unknown COLUMN 'forum_id' IN 'field list'
Указать явно значение forum_id не можем, так как
такого поля нет в определении представления:
Таким образом, наше представление, основанное на
двух таблицах, позволяет обновлять обе таблицы и
добавлять данные только в одну из них (родительскую).
33. 6. Модифицируемые представления
33Особенности работы с VIEW в базах данных SQLite
Представления в SQLite нельзя обновлять (стандартными способами), их можно только
создавать, удалять и делать выборку из VIEW.
Create view if not exists vendor_incoming as
select id_incoming,date_incoming, v.id_vendor, name, city, address
From vendors v join incoming I on v.id_vendor=i.id_vendor
Update vendor_incoming set name="Новое имя" Where id_vendor=1''');
conn.commit()
Traceback (most recent call last):
File "C:\Users\TM\Downloads\BD_Shop (1).py", line 217, in <module>
c.execute('''Update vendor_incoming set name="Новое имя" Where id_vendor=1''');
sqlite3.OperationalError: cannot modify vendor_incoming because it is a view
34. 7. Использование триггеров для изменения данных через изменение представлений.
34В некоторых СУБД (SQLite, FireBird, InterBase) есть возможность подключения триггеров
к представлениям. Позволяет обходить ограничение представлений на модификацию.
Create view if not exists vendor_incoming as
select id_incoming,date_incoming, v.id_vendor, name, city, address
From vendors v join incoming I on v.id_vendor=i.id_vendor
Create trigger if not exists update_vendor_incoming
instead of update on vendor_incoming
for each row
Begin
Update vendors
Set name=new.name, city=new.city, address=new.address Where id_vendor=old.id_vendor;
end
Update incoming
Set date_incoming=new.date_incoming Where id_incoming=old.id_incoming;
update vendor_incoming set name="Новое имя" Where id_vendor=1''');
conn.commit()
35. 7. Использование триггеров для изменения данных через изменение представлений.
vendor до изменения данных[(1, 'Вильямс', 'Москва', 'ул.Лесная, д.43'),
(2, 'Дом печати', 'Минск', 'пр.Ф.Скорины, д.18'),
(3, 'БХВ-Петербург', 'Санкт-Петербург', 'ул.Есенина, д.5')]
incoming до изменения данных
[(1, 3, '2011-04-10'), (2, 1, '2011-04-11'), (3, 2, '2011-04-12')]
vendor_incoming до изменения данных
[(1, '2011-04-10', 3, 'БХВ-Петербург', 'Санкт-Петербург', 'ул.Есенина, д.5'),
(2, '2011-04-11', 1, 'Вильямс', 'Москва', 'ул.Лесная, д.43'),
(3, '2011-04-12', 2, 'Дом печати', 'Минск', 'пр.Ф.Скорины, д.18')]
vendor_incoming после изменения данных
[(1, '2011-04-10', 3, 'БХВ-Петербург', 'Санкт-Петербург', 'ул.Есенина, д.5'),
(2, '2011-04-11', 1, 'Новое имя', 'Москва', 'ул.Лесная, д.43'),
(3, '2023-05-07', 2, 'Дом печати', 'Минск', 'пр.Ф.Скорины, д.18')]
vendors после изменения данных
[(1, 'Новое имя', 'Москва', 'ул.Лесная, д.43'),
(2, 'Дом печати', 'Минск', 'пр.Ф.Скорины, д.18'),
(3, 'БХВ-Петербург', 'Санкт-Петербург', 'ул.Есенина, д.5')]
35
36. 7. Использование триггеров для изменения данных через изменение представлений.
36Create trigger if not exists insert_vendor_incoming
instead of insert on vendor_incoming
for each row
Begin
insert into vendors (name,city,address) select distinct new.name, new.city, new.address from
vendor_incoming where new.name not in (select name from vendors);
insert into incoming (id_vendor, date_incoming) values ((select id_vendor from vendors where
name=new.name), new.date_incoming);
end
insert into vendor_incoming (name,city,address,date_incoming) values ("Дом печати","Минск","пр.Ф.Скорины,
д.18","2023-01-01")
conn.commit()
insert into vendor_incoming (name,city,address,date_incoming) values ("Новый поставщик","Челябинск", "ул. Бр.
Каш","2023-04-18")
conn.commit()
37.
7. Использование триггеров для изменения данных черезизменение представлений.
vendor_incoming после ввода
[(1, '2011-04-10', 3, 'БХВ-Петербург', 'Санкт-Петербург', 'ул.Есенина, д.5'),
(2, '2011-04-11', 1, 'Новое имя', 'Москва', 'ул.Лесная, д.43'),
(3, '2011-04-12', 2, 'Дом печати', 'Минск', 'пр.Ф.Скорины, д.18'),
(4, '2023-01-01', 2, 'Дом печати', 'Минск', 'пр.Ф.Скорины, д.18'),
(5, '2023-04-18', 4, 'Новый поставщик', 'Челябинск', 'ул. Бр. Каш')]
vendors после ввода
[(1, 'Новое имя', 'Москва', 'ул.Лесная, д.43'),
(2, 'Дом печати', 'Минск', 'пр.Ф.Скорины, д.18'),
(3, 'БХВ-Петербург', 'Санкт-Петербург', 'ул.Есенина, д.5'),
(4, 'Новый поставщик', 'Челябинск', 'ул. Бр. Каш')]
incoming после ввода
[(1, 3, '2011-04-10'),
(2, 1, '2011-04-11'),
(3, 2, '2011-04-12'),
(4, 2, '2023-01-01'),
(5, 4, '2023-04-18')]
37
38.
38Итог:
• Использование представлений в SQL и реляционных базах данных
• После создания представлений их можно использовать так же, как таблицы.
• То есть выполнять запросы к ним, фильтровать и сортировать данные, соединять одни
представления с другими.
• С одной стороны это очень удобный способ хранения часто применяемых сложных
запросов.
• Но следует помнить, что представления - это не таблицы, то есть они не хранят данные, а
лишь извлекают их из других таблиц.
Отсюда,
• во-первых, при изменении данных в таблицах, результаты представления также будут
меняться.
• во-вторых, при запросе к представлению происходит поиск необходимых данных, то есть
производительность СУБД снижается. Поэтому злоупотреблять ими не стоит.
database