Попытка вставить данные в необновляемое представление.
Создание View с уже существующим именем без OR REPLACE.
Использование ORDER BY внутри View без LIMIT в MySQL.
Забыть указать WITH CHECK OPTION, когда нужно защитить фильтр.
Считать, что View физически хранит данные.
1
Ошибка: INSERT в необновляемое представление
Представление с агрегацией, DISTINCT или несколькими таблицами обычно не позволяет изменять исходные данные.
-- Ошибка: представление содержит вычисляемый столбец
INSERT INTO Employee_Summary_View (FirstName, LastName)
VALUES ('Frank', 'White');
Исправление: вставляйте данные напрямую в исходную таблицу Employees.
2
Ошибка: View с таким именем уже существует
Повторный CREATE VIEW с тем же именем вызовет ошибку. Используйте CREATE OR REPLACE VIEW или сначала удалите старое представление.
-- Безопаснее
CREATE OR REPLACE VIEW Employee_Names_View AS
SELECT EmployeeID, FirstName FROM Employees;
-- Или сначала удалить
DROP VIEW IF EXISTS Employee_Names_View;
CREATE VIEW Employee_Names_View AS
SELECT EmployeeID, FirstName FROM Employees;
3
Ошибка: ORDER BY внутри View
В MySQL View не может содержать ORDER BY без LIMIT. Сортировку делают при запросе к View.
-- Ошибка в MySQL
CREATE VIEW Sorted_Employees_View AS
SELECT * FROM Employees ORDER BY Salary DESC;
-- Правильно
CREATE VIEW Employees_View AS
SELECT * FROM Employees;
SELECT * FROM Employees_View ORDER BY Salary DESC;
4
Ошибка: отсутствие WITH CHECK OPTION
Без WITH CHECK OPTION через обновляемое View можно изменить строку так, что она исчезнет из представления.
-- Без защиты: строка исчезнет из Berlin_Employees_View
UPDATE Berlin_Employees_View
SET City = 'Hamburg'
WHERE EmployeeID = 1;
-- С защитой: UPDATE вернёт ошибку
CREATE VIEW Berlin_Employees_View AS
SELECT * FROM Employees WHERE City = 'Berlin'
WITH CHECK OPTION;
5
Ошибка: предположение, что View хранит данные
View — это сохранённый запрос. Каждый раз при обращении к View СУБД выполняет его заново. Если исходная таблица изменилась, результат View тоже изменится.
-- View всегда возвращает актуальные данные
SELECT * FROM All_Employees_View; -- результат зависит от текущего состояния Employees