Учебники

9) ВСТАВИТЬ, ОБНОВИТЬ, УДАЛИТЬ

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

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

Обратите внимание, что для всех следующих примеров вы должны запустить sqlite3.exe и открыть соединение с образцом базы данных как текущее:

Шаг 1) На этом этапе

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

SQLite Query - INSERT, UPDATE, DELETE

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

.open TutorialsSampleDB.db

SQLite Query - INSERT, UPDATE, DELETE

Теперь вы готовы выполнить любой тип запроса к базе данных.

SQLite INSERT

SQLite INSERT используется для вставки записей в указанную таблицу базы данных. Вы должны использовать предложение INSERT. Синтаксис предложения INSERT выглядит следующим образом:

SQLite Query - INSERT, UPDATE, DELETE

  • После предложения INSERT вы должны указать, в какую таблицу вам нужно вставить значения.
  • После имени таблицы вы пишете список столбцов, в которые хотите вставить значения.
  • Вы можете игнорировать имя столбца и не писать в него.
  • Если вы не напишите имя столбца, значения будут вставлены во все столбцы, найденные в таблице в том же порядке, столбцы определены в таблице.
  • После предложения VALUES вы должны перечислить значения для вставки.
  • Каждое предложение INSERT вставляет только одну строку. Если вы хотите вставить несколько строк, вы должны написать несколько предложений INSERT, по одному для каждой строки.

Пример вставки SQLite

В следующем примере мы вставим 2 строки в таблицу студентов, по одной для каждого студента:

INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth)
              VALUES(11, 'Ahmad', 4, '1997-10-12');

INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');

Это должно работать успешно, и для этого нет вывода:

SQLite Query - INSERT, UPDATE, DELETE

Это вставит двух студентов:

  • Первый студент с StudentId = 11, StudentName = Ahmad, DepartmentId = 4 и DateOfBirth = 1997-10-12.
  • Второй студент с StudentId = 12, StudentName = Aly, DepartmentId = 4 и DateOfBirth = 1996-10-12 ‘.

В первом утверждении мы перечислили имена столбцов « StudentId, StudentName, DepartmentId, DateOfBirth ». Однако во втором утверждении мы этого не сделали.

Четыре значения « 12,« Aly », 4,« 1996-10-12 » » будут вставлены во все четыре столбца таблицы «Студенты» в том же порядке, в котором они определены.

Теперь давайте проверим, что два студента были вставлены в таблицу «Студенты», выполнив следующий запрос:

SELECT * FROM Students;

Затем вы должны увидеть двух студентов, возвращенных из этого запроса, следующим образом:

SQLite Query - INSERT, UPDATE, DELETE

Обновление SQLite

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

SQLite Query - INSERT, UPDATE, DELETE

Следующим образом:

  • После «условия обновления» вы должны написать имя таблицы для обновления.
  • Вы должны написать «предложение SET», которое используется для записи имени столбца для обновления и значения для обновления.
  • Вы можете обновить более одного столбца. Вы можете использовать запятую между каждой строкой.
  • Вы можете указать предложение WHERE, чтобы указать только некоторые строки. Обновляются только те строки, которые выражение оценивает как истинные. Если вы не указали предложение WHERE, все строки будут обновлены.

Пример обновления SQLite

В следующем утверждении UPDATE мы обновим значение DepartmentId для ученика со значением StudentId = 6, равным 3:

UPDATE Students
SET DepartmentId = 3 
WHERE StudentId = 6;

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

SQLite Query - INSERT, UPDATE, DELETE

В предложении UPDATE мы указали, что хотим обновить таблицу учеников.

  • В предложении WHERE мы отфильтровали всех учащихся, чтобы выбрать только строку для StudentId = 6.
  • Предложение SET обновит значение идентификатора отделения для выбранных студентов до 3.

Теперь давайте проверим, что студент с ID 6 обновлен, выполнив следующую команду:

SELECT * FROM Students WHERE StudentId = 6;

Теперь вы должны увидеть, что значение Id отдела теперь равно 3:

SQLite Query - INSERT, UPDATE, DELETE

SQLite Удалить

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

Предложение DELETE имеет следующий синтаксис:

SQLite Query - INSERT, UPDATE, DELETE

  • Вы должны написать имя таблицы после предложения DELETE FROM, из которого вы хотите удалить записи. ( Обратите внимание: предложение DELETE используется для удаления некоторых записей из таблицы или удаления всех записей, и оно не удаляет саму таблицу. Однако предложение DROP используется для удаления всей таблицы со всеми записями в ней. )
  • Если вы напишите предложение DELETE, например, «DELETE FROM guru», это удалит все записи из таблицы «guru».
  • Вы можете указать условие WHERE с помощью выражения, если хотите удалить некоторые конкретные строки. Будут удалены только те строки, для которых выражение имеет значение true. Например, «УДАЛИТЬ ИЗ ГУРА, ГДЕ id> 5» — это удалит только записи с идентификатором больше 5.

пример

В следующем утверждении мы удалим двух студентов с StudentId 11 и 12:

DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;

Выражение « StudentId = 11 ИЛИ StudentId = 12 » будет истинным только для студентов с идентификаторами 11 и 12. Таким образом, предложение DELETE будет применено к обоим и удалит только их.

Эта команда должна быть выполнена успешно, и вы не должны получать никаких выводов, как показано ниже:

SQLite Query - INSERT, UPDATE, DELETE

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

SELECT * FROM Students;

Вы не должны видеть двух студентов с идентификаторами 11 и 12 следующим образом:

SQLite Query - INSERT, UPDATE, DELETE

SQLite Conflict Clause

Предположим, у вас есть столбец с одним из следующих ограничений: UNIQUE, NOT NULL, CHECK или PRIMARY KEY. Затем вы попытались вставить или обновить значение в этом столбце значением, которое конфликтует с этим ограничением.

Например, если столбец имеет ограничение UNIQUE, и вы попытались вставить уже существующее значение (дублирующее значение), которое конфликтует с ограничением UNIQUE. Затем предложение CONFLICT позволяет вам выбрать, что делать в таких случаях для разрешения этого конфликта.

Прежде чем мы продолжим объяснение, как предложение CONFLICT разрешает конфликт. Вы должны понимать, что такое транзакция базы данных.

Транзакция базы данных:

Термин транзакция базы данных — это список операций SQLite (вставка, обновление или удаление). Транзакция базы данных должна быть выполнена как единое целое, либо все операции выполнены успешно, либо не выполнены вообще. Все операции будут отменены, если одна из них не будет выполнена.

Пример для транзакции базы данных:

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

Вот список из пяти решений, которые вы можете выбрать в предложении CONFLICT:

  1. ROLLBACK — откат транзакции, в которой находится текущий оператор SQLite, который имеет конфликт (отменяет всю транзакцию). Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то никакие строки не будут обновлены, 10 строк останутся прежними. Ошибка будет выдана.
  2. ABORT — это прервет (отменит) только текущий оператор SQLite, имеющий конфликт, и транзакция не будет отменена. Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то только пятое значение не будет обновлено, а остальные 9 строк будут обновлены. Ошибка будет выдана.
  3. FAIL — прерывает текущий оператор SQLite, имеющий конфликт. Однако транзакция не будет продолжена, но предыдущие изменения, внесенные в строки до строки, в которой возник конфликт, будут зафиксированы. Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то будут обновлены только 4 строки, а другая — нет. Ошибка будет выдана.
  1. IGNORE — при этом пропускается строка, содержащая нарушение ограничения, и продолжается обработка других следующих строк оператора SQLite. Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то будут обновлены только 4 строки, а другая — нет. Он не будет продолжать обновлять другие строки и останавливаться на строке, которая имеет значение конфликта. Никаких ошибок не будет.
  1. ЗАМЕНИТЕ — это зависит от типа ограничения, которое имеет нарушение:
  • При наличии нарушения ограничения для ограничения UNIQUE или PRIMARY KEY. ЗАМЕНА заменит строку, которая вызывает нарушение, новой вставленной или обновленной строкой.
  • При нарушении ограничения NOT NULL предложение REPLACE заменяет значение NULL значением по умолчанию для этого столбца. Если столбец не имеет значения по умолчанию, SQLite прервет оператор (оператор будет отменен)
  • Если произойдет нарушение ограничения CHECK, предложение будет отменено.

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

Как объявить предложение CONFLICT

Вы можете объявить предложение ON CONFLICT, когда определяете ограничение для определения столбца в предложении CREATE TABLE. Используя следующий синтаксис:

SQLite Query - INSERT, UPDATE, DELETE

Вы можете выбрать один из пяти вариантов разрешения конфликта, как описано выше.

Пример по конфликтному игнорированию

Шаг 1) Создайте новую тему таблицы следующим образом:

CREATE TABLE [Subjects] (  
    [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE,
    [SubjectName] NVARCHAR NOT NULL
); 

Обратите внимание, что мы определили ограничение PRIMARY KEY для столбца SubjectId. Ограничение первичного ключа не позволяет вставлять два дублированных значения в столбец SubjectId, поэтому все значения в этом столбце должны быть уникальными. Также обратите внимание, что мы выбираем разрешение конфликта как « IGNORE ».

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

SQLite Query - INSERT, UPDATE, DELETE

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

INSERT INTO Subjects VALUES(1, 'Algebra');
INSERT INTO Subjects VALUES(2, 'Database Course');
INSERT INTO Subjects VALUES(2, 'Data Structures');
INSERT INTO Subjects VALUES(4, 'Algorithms');

В этом операторе INSERT мы попытались вставить два курса с одинаковым идентификатором субъекта первичного ключа 2, что является нарушением ограничения первичного ключа.

Команды должны работать нормально, и вы не должны получать никаких ошибок. Следующим образом:

SQLite Query - INSERT, UPDATE, DELETE

Шаг 3) Выберите все предметы из таблицы следующим образом:

SELECT * FROM Subjects;

Это даст вам список предметов:

SQLite Query - INSERT, UPDATE, DELETE

Обратите внимание, что вместо четырех строк были вставлены только три предмета: « Алгебра, Курс базы данных и Алгоритмы ».

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

Шаг 4) УДАЛИТЕ субъекты таблицы, чтобы создать ее заново с другим предложением ON CONFLICT для следующего примера, выполнив следующую команду:

DROP TABLE Subjects;		

Команда удаления удаляет всю таблицу. Темы таблиц теперь не существует.

Пример замены конфликта

Шаг 1) Создайте новую тему таблицы следующим образом:

CREATE TABLE [Subjects] (  
    [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE,
    [SubjectName] NVARCHAR NOT NULL
); 

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

Также обратите внимание, что мы выбрали вариант разрешения конфликта « ЗАМЕНИТЬ ». Команда должна быть выполнена успешно, и вы не должны получить никаких ошибок:

SQLite Query - INSERT, UPDATE, DELETE

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

INSERT INTO Subjects VALUES(1, 'Algebra');
INSERT INTO Subjects VALUES(2, 'Database Course');
INSERT INTO Subjects VALUES(2, 'Data Structures');
INSERT INTO Subjects VALUES(4, 'Algorithms');

В этом операторе INSERT мы попытались вставить два курса с одинаковым идентификатором субъекта первичного ключа 2, что является нарушением ограничения первичного ключа.

Команды должны работать нормально, и вы не должны получать никаких ошибок. Следующим образом:

SQLite Query - INSERT, UPDATE, DELETE

Шаг 3) Выберите все предметы из таблицы следующим образом:

SELECT * FROM Subjects;

Это даст вам список предметов:

SQLite Query - INSERT, UPDATE, DELETE

Обратите внимание, что были вставлены только три объекта « Алгебра, Структуры данных и Алгоритмы », тогда как мы попытались вставить 4 строки.

Строка со значением, нарушающим ограничение первичного ключа, а именно « Структуры данных », заменила значение « Курс базы данных » следующим образом:

  • Первые два оператора вставки работают без проблем. Два предмета: алгебра и база данных курса будут вставлены с идентификаторами 1, 2.
  • Когда SQLite пытается запустить третий оператор вставки с SubjectId 2 и SubjectName « Структуры данных », он обнаруживает, что уже существует субъект с SubjectId = 2. Что является нарушением ограничения первичного ключа, определенного в столбце SubjectId.
  • SQLite выберет разрешение REPLACE для этого конфликта. Он заменяет значение, которое уже существует в таблице субъектов, новым значением из оператора вставки. Таким образом, SubjectName « Курс базы данных » будет заменен на SubjectName « Структуры данных ».

Резюме:

Предложения INSERT, UPDATE и DELETE используются для изменения данных в базе данных SQLite. Предложение CONFLICT является мощным предложением для разрешения любого конфликта между данными и данными для изменения.