Учебники

10) ВИД, ИНДЕКС, ТРИГГЕР

При ежедневном использовании SQLite вам потребуются некоторые инструменты администрирования вашей базы данных. Вы также можете использовать их для более эффективного запроса к базе данных путем создания индексов или для более повторного использования путем создания представлений.

В этом уроке вы узнаете —

SQLite View

Представления очень похожи на таблицы. Но представления являются логическими таблицами; они не хранятся физически как таблицы. Представление состоит из оператора выбора.

Вы можете определить представление для ваших сложных запросов, и вы можете повторно использовать эти запросы, когда захотите, вызывая представление напрямую, а не переписывая запросы снова.

CREATE VIEW заявление

Чтобы создать представление для базы данных, вы можете использовать оператор CREATE VIEW, за которым следует имя представления, а затем поставить нужный запрос после этого.

Пример:

В следующем примере мы создадим представление с именем « AllStudentsView » в примере базы данных « TutorialsSampleDB.db » следующим образом:

Шаг 1) Откройте «Мой компьютер» и перейдите в следующий каталог « C: \ sqlite », а затем откройте « sqlite3.exe »:

Sqlite Index, Trigger & View

Шаг 2) Откройте базу данных « TutorialsSampleDB.db » с помощью следующей команды:

Sqlite Index, Trigger & View

Шаг 3) Ниже приведен основной синтаксис команды sqlite3 для создания представления.

CREATE VIEW AllStudentsView
AS
  SELECT 
    s.StudentId,
    s.StudentName,
    s.DateOfBirth,
    d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Не должно быть никакого вывода от команды как это:

Sqlite Index, Trigger & View

Шаг 4) Чтобы убедиться, что представление создано, вы можете выбрать список представлений в базе данных, выполнив следующую команду:

SELECT name FROM sqlite_master WHERE type = 'view';

Вы должны увидеть, что представление « AllStudentsView » возвращается:

Sqlite Index, Trigger & View

Шаг 5) Теперь наше представление создано, вы можете использовать его как обычную таблицу примерно так:

SELECT * FROM AllStudentsView;

Эта команда запросит представление «AllStudents» и выберет все строки из него, как показано на следующем снимке экрана:

Sqlite Index, Trigger & View

Временные просмотры

Временные представления являются временными для текущего соединения с базой данных, использованного для его создания. Затем, если вы закроете соединение с базой данных, все временные представления будут автоматически удалены. Временные представления создаются с помощью одной из следующих команд:

  • СОЗДАТЬ ТЕМП. ВИД, или
  • СОЗДАТЬ ВРЕМЕННЫЙ ВИД.

Временные просмотры полезны, если вы хотите сделать какие-то операции на данный момент и не хотите, чтобы они были постоянными. Итак, вы просто создаете временное представление, а затем выполняете обработку с использованием этого представления. Позже, когда вы закроете соединение с базой данных, оно будет удалено автоматически.

Пример:

В следующем примере мы откроем соединение с базой данных, а затем создадим временное представление.

После этого мы закроем это соединение и проверим, существует ли временное представление или нет.

Шаг 1) Откройте файл sqlite3.exe из каталога « C: \ sqlite », как описано выше.

Шаг 2) Откройте соединение с базой данных « TutorialsSampleDB.db », выполнив следующую команду:

.open TutorialsSampleDB.db

Шаг 3) Напишите следующую команду, которая создаст временное представление « AllStudentsTempView »:

CREATE TEMP VIEW AllStudentsTempView
AS
  SELECT 
    s.StudentId,
    s.StudentName,
    s.DateOfBirth,
    d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Sqlite Index, Trigger & View

Шаг 4) Убедитесь, что временное представление « AllStudentsTempView » создано с помощью следующей команды:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

Sqlite Index, Trigger & View

Шаг 5) Закройте sqlite3.exe и снова откройте его.

Шаг 6) Откройте соединение с базой данных « TutorialsSampleDB.db » с помощью следующей команды:

.open TutorialsSampleDB.db

Шаг 7) Запустите следующую команду, чтобы получить список временного представления, созданного в базе данных:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

Вы не должны видеть никаких выходных данных, поскольку созданное нами временное представление удаляется, когда мы закрывали соединение с базой данных на предыдущем шаге. В противном случае, пока вы сохраняете соединение с открытой базой данных, вы сможете видеть временное представление с данными.

Sqlite Index, Trigger & View

Ноты:

  • Вы не можете использовать операторы INSERT, DELETE или UPDATE с представлениями, только вы можете использовать команду «выбрать из представлений», как показано в шаге 5 в примере CREATE View.
  • Чтобы удалить VIEW, вы можете использовать оператор «DROP VIEW»:
DROP VIEW AllStudentsView;

Чтобы убедиться, что представление удалено, вы можете запустить следующую команду, которая выдаст вам список представлений в базе данных:

SELECT name FROM sqlite_master WHERE type = 'view';

Вы не найдете никаких просмотров, возвращенных, поскольку представление было удалено, как показано ниже:

Sqlite Index, Trigger & View

SQLite Index

Если у вас есть книга, и вы хотите найти ключевое слово в этой книге. Вы будете искать это ключевое слово в индексе книги. Затем перейдите к номеру страницы для этого ключевого слова, чтобы узнать больше информации об этом ключевом слове.

Однако, если в этой книге нет ни номера книги, ни номера страницы, вы будете сканировать всю книгу от начала до конца, пока не найдете ключевое слово, которое ищете. И это очень сложно, особенно если у вас есть индекс и очень медленный процесс поиска по ключевому слову.

Индексы в SQLite (и та же концепция, которая применима и для других систем управления базами данных) работают так же, как индексы, приведенные в конце книги.

При поиске некоторых строк в таблице SQLite с критериями поиска SQLite будет выполнять поиск по всем строкам таблицы, пока не найдет искомые строки, соответствующие критериям поиска. И этот процесс становится очень медленным, когда у вас большие таблицы.

Индексы ускорят поисковые запросы для данных и помогут выполнять извлечение данных из таблиц. Индексы определяются по столбцам таблицы.

Улучшение производительности с помощью индексов:

Индексы могут повысить производительность поиска данных в таблице. Когда вы создаете индекс для столбца, SQLite создаст структуру данных для этого индекса, где каждое значение поля имеет указатель на всю строку, которой принадлежит значение.

Затем, если вы запустите запрос с условием поиска для столбца, который является частью индекса, SQLite сначала будет искать значение в индексе. SQLite не будет сканировать всю таблицу на предмет этого. Затем он будет читать место, где значение указывает на строку таблицы. SQLite найдет строку в этом месте и получит ее.

Однако, если столбец, который вы ищете, не является частью индекса, SQLite выполнит сканирование значений столбца, чтобы найти данные, которые вы ищете. Обычно это будет более медленный процесс, если нет индекса.

Представьте себе книгу без индекса, и вам нужно найти определенное слово. Вы отсканируете всю книгу от первой до последней страницы в поисках этого слова. Однако, если у вас есть указатель на эту книгу, вы сначала найдете слово в ней. Получить номер страницы, где он находится, а затем перейдите к нему. Что будет намного быстрее, чем сканирование всей книги от корки до корки.

SQLite CREATE INDEX

Чтобы создать индекс по столбцу, вы должны использовать команду CREATE INDEX. И вы должны определить это следующим образом:

  • Вы должны указать имя индекса после команды CREATE INDEX.
  • После имени индекса необходимо указать ключевое слово «ON», а затем имя таблицы, в которой будет создан индекс.
  • Затем список имен столбцов, которые используются для индекса.
  • Вы можете использовать одно из следующих ключевых слов «ASC» или «DESC» после любого имени столбца, чтобы указать порядок сортировки, используемый для упорядочения данных индекса.

Пример:

В следующем примере мы создадим индекс «StudentNameIndex » для таблицы студентов в базе данных « Студенты » следующим образом:

Шаг 1) Перейдите в папку « C: \ sqlite », как описано выше.

Шаг 2) Откройте sqlite3.exe.

Шаг 3) Откройте базу данных « TutorialsSampleDB.db » с помощью следующей команды:

.open TutorialsSampleDB.db

Шаг 4) Создайте новый индекс « StudentNameIndex », используя следующую команду:

CREATE INDEX StudentNameIndex ON Students(StudentName);

Вы не должны видеть вывод для этого:

Sqlite Index, Trigger & View

Шаг 5) Чтобы убедиться, что индекс был создан, вы можете выполнить следующий запрос, который даст вам список индексов, созданных в таблице учеников:

PRAGMA index_list(Students);

Вы должны увидеть индекс, который мы только что создали:

Sqlite Index, Trigger & View

Ноты:

  • Индексы могут быть созданы не только на основе столбцов, но и выражений. Что-то вроде этого:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);

«OrderTotalIndex» будет основываться на столбце OrderId, а также на умножении значения столбца «Количество» и значения столбца «Цена». Таким образом, любой запрос для «OrderId» и «Количество * Цена» будет эффективным, так как запрос будет использовать индекс.

  • Если вы задали предложение WHERE в операторе CREATE INDEX, индекс будет частичным. В этом случае в индексе будут записи только для тех строк, которые соответствуют условиям в предложении WHERE. Например, в следующем индексе:
    CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price)
    WHERE Quantity > 10000;

    (В приведенном выше примере индекс будет частичным индексом, так как задано предложение WHERE. В этом случае индекс будет применяться только к тем заказам, количество которых превышает 10000. Обратите внимание, что этот индекс называется частичным index из-за предложения WHERE, а не из выражения, используемого в нем. Однако вы можете использовать выражения с обычными индексами.)

  • Вы можете использовать инструкцию CREATE UNIQUE INDEX вместо CREATE INDEX, чтобы предотвратить повторяющиеся записи для столбцов, и, таким образом, все значения для индексированного столбца будут уникальными.
  • Чтобы удалить индекс, используйте команду DROP INDEX, а затем имя индекса для удаления.

SQLite Trigger

Введение в SQLite Trigger

Триггеры — это автоматические предопределенные операции, выполняемые, когда в таблице базы данных происходит определенное действие. Триггер может быть определен так, чтобы срабатывать всякий раз, когда в таблице происходит одно из следующих действий:

  • ВСТАВЬТЕ в стол.
  • УДАЛИТЬ строки из таблицы.
  • ОБНОВИТЬ один из столбцов таблицы.

SQLite поддерживает триггер FOR EACH ROW, поэтому предопределенные операции в триггере будут выполняться для всех строк, участвующих в действиях над таблицей (будь то вставка, удаление или обновление).

SQLite CREATE TRIGGER

Чтобы создать новый TRIGGER, вы можете использовать инструкцию CREATE TRIGGER следующим образом:

  • После CREATE TRIGGER вы должны указать имя триггера.
  • После имени триггера вы должны указать, когда именно имя триггера должно быть выполнено. У вас есть три варианта:
    • BEFORE — триггер будет выполнен перед указанием оператора INSERT, UPDATE или оператора delete.
    • После — триггер будет выполнен после указанного оператора INSERT, UPDATE или оператора delete.
    • INSTEAD OF — Он заменит действие, которое произвело триггер, оператором, указанным в TRIGGER. Триггер INSTEAD OF не применим к таблицам, только к представлениям.
  • Затем необходимо указать тип действия, триггер сработает, когда это произойдет. Либо УДАЛИТЬ, ВСТАВИТЬ или ОБНОВИТЬ.
  • Вы можете выбрать необязательное имя столбца, чтобы триггер не срабатывал, если в этом столбце не произошло действие.
  • Затем вы должны указать имя таблицы, в которой будет создан триггер.
  • Внутри тела триггера вы должны указать инструкцию, которая должна выполняться для каждой строки при запуске триггера.

Триггеры будут активированы (сработали) только в зависимости от типа оператора, указанного в команде создания триггера. Например:

  • Триггер BEFORE INSERT будет активирован (запущен) перед любым оператором вставки.
  • Триггер AFTER UPDATE будет активирован (запущен) после любого оператора обновления, … и так далее.

Внутри триггера вы можете ссылаться на вновь вставленные значения, используя ключевое слово «new». Также вы можете ссылаться на удаленные или обновленные значения, используя старое ключевое слово. Следующим образом:

  • Внутри триггеров INSERT — можно использовать новое ключевое слово.
  • Внутри триггеров UPDATE — можно использовать новые и старые ключевые слова.
  • Внутри триггеров DELETE — можно использовать старое ключевое слово.

пример

Далее мы создадим триггер, который сработает перед вставкой нового ученика в таблицу « Студенты ».

Он будет записывать вновь вставленного студента в таблицу « StudentsLog » с автоматической отметкой времени для текущей даты, когда произошло утверждение вставки. Следующим образом:

Шаг 1) Перейдите в каталог « C: \ sqlite » и запустите sqlite3.exe.

Шаг 2) Откройте базу данных « TutorialsSampleDB.db », выполнив следующую команду:

.open TutorialsSampleDB.db

Шаг 3) создать триггер « InsertIntoStudentTrigger », выполнив следующую команду:

CREATE TRIGGER InsertIntoStudentTrigger 
       BEFORE INSERT ON Students
BEGIN
  INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert');
END;	

Функция datetime () выдаст вам текущую дату и время, когда произошла вставка. Чтобы мы могли регистрировать транзакцию вставки с автоматическими отметками времени, добавленными к каждой транзакции.

Команда должна быть выполнена успешно, и вы не получите ничего:

Sqlite Index, Trigger & View

Триггер « InsertIntoStudentTrigger » будет срабатывать каждый раз, когда вы вставляете нового ученика в таблицу учеников. Ключевое слово « new » относится к значениям, которые будут вставлены. Например, « new.StudentId » будет идентификатором студента, который будет вставлен.

Теперь мы проверим, как работает триггер, когда мы вставляем нового студента.

Шаг 4) Напишите следующую команду, которая вставит нового ученика в таблицу учеников:

INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');

Шаг 5) Напишите следующую команду, которая выберет все строки из таблицы « StudentsLog »:

SELECT * FROM StudentsLog;

Вы должны увидеть новую строку, возвращенную для нового студента, которого мы только что добавили:

Sqlite Index, Trigger & View

Этот ряд был вставлен триггером перед вставкой нового студента с идентификатором 11.

В этом примере мы использовали созданный нами триггер « InsertIntoStudentTrigger », чтобы автоматически регистрировать любые транзакции вставки в таблице « StudentsLog ». Таким же образом вы можете регистрировать любое обновление или удалять операторы.

Предотвращение непреднамеренных обновлений с помощью триггеров:

Используя триггеры BEFORE UPDATE для таблицы, вы можете запретить операторы обновления для столбца на основе выражения.

пример

В следующем примере мы не допустим, чтобы какой-либо оператор обновления обновлял столбец «имя студента» в таблице «Студенты»:

Шаг 1) Перейдите в каталог « C: \ sqlite » и запустите sqlite3.exe.

Шаг 2) Откройте базу данных « TutorialsSampleDB.db », выполнив следующую команду:

.open TutorialsSampleDB.db

Шаг 3) Создайте новый триггер « warnUpdateStudentName » в таблице « Студенты », выполнив следующую команду

CREATE TRIGGER preventUpdateStudentName
BEFORE UPDATE OF StudentName ON Students
FOR EACH ROW
BEGIN
    SELECT RAISE(ABORT, 'You cannot update studentname');
END;

Команда « RAISE » вызовет ошибку с сообщением об ошибке « Невозможно обновить имя студента », а затем предотвратит выполнение оператора обновления.

Теперь мы проверим, что триггер работает хорошо, и он предотвращает любое обновление столбца имени студента.

Шаг 4) Запустите следующую команду обновления, которая изменит имя студента « Джек » на « Джек1 ».

UPDATE Students SET StudentName = 'Jack1' WHERE StudentName = 'Jack';	

Вы должны получить сообщение об ошибке, которое мы указали на триггере: « Вы не можете обновить имя студента » следующим образом:

Sqlite Index, Trigger & View

Шаг 5) Запустите следующую команду, которая выберет список имен учеников из таблицы учеников.

SELECT StudentName FROM Students;

Вы должны увидеть, что имя студента «Джек» остается прежним, и оно не меняется:

Sqlite Index, Trigger & View

Резюме:

Представления, индексы и триггеры являются очень мощными инструментами для администрирования базы данных SQLite. Вы можете отслеживать операции модификации данных, когда они происходят в таблице. Вы также можете оптимизировать операцию извлечения данных из базы данных, создав индексы.