← К оглавлению занятия

🐛 Типичные ошибки

⚡ Кратко: ошибки

  • Попытка вставить данные в необновляемое представление.
  • Создание 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