Предложения изменения данных в SQLite - это операторы INSERT, UPDATE и DELETE. Он используется для вставки новых строк, обновления существующих значений или удаления строк из базы данных.
В этом руководстве вы узнаете:
- ВСТАВЛЯТЬ
- Обновлять
- Удалить
- Оговорка о конфликте
Обратите внимание, что для всех следующих примеров вы должны запустить sqlite3.exe и открыть соединение с образцом базы данных как текущее:
Шаг 1) На этом шаге
- Откройте «Мой компьютер» и перейдите в следующий каталог « C: \ sqlite » и
- Затем откройте sqlite3.exe :
Шаг 2) Откройте базу данных TutorialsSampleDB.db с помощью следующей команды:
.open TutorialsSampleDB.db
Теперь вы готовы выполнить любой тип запроса к базе данных.
SQLite ВСТАВИТЬ
SQLite INSERT используется для вставки записей в указанную таблицу базы данных. вы должны использовать предложение INSERT. Синтаксис предложения INSERT следующий:
- После предложения INSERT вы должны указать, в какую таблицу вам нужно вставить значения.
- После имени таблицы вы пишете список столбцов, в которые хотите вставить значения.
- Вы можете игнорировать имена столбцов и не писать в них.
- Если вы не укажете имя столбца, значения будут вставлены во все столбцы, найденные в таблице, в том же порядке, столбцы определены в таблице.
- После предложения VALUES вы должны перечислить значения, которые нужно вставить.
- Каждое предложение INSERT вставляет только одну строку. Если вы хотите вставить несколько строк, вы должны написать несколько предложений INSERT, по одному для каждой строки.
Пример вставки SQLite
В следующем примере мы вставим 2 строки в таблицу студентов, по одной для каждого студента:
ВСТАВИТЬ студентов (StudentId, StudentName, DepartmentId, DateOfBirth)ЦЕННОСТИ (11, 'Ахмад', 4, '1997-10-12');ВСТАВИТЬ В ЦЕННОСТИ студентов (12, 'Aly', 4, '1996-10-12');
Это должно работать успешно, и для этого нет вывода:
Это вставит двух студентов:
- Первый студент с 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' » будут вставлены во все четыре столбца таблицы «Студенты» в том же порядке, в котором они определены.
Теперь давайте проверим, что два студента были вставлены в таблицу «Студенты», выполнив следующий запрос:
ВЫБРАТЬ * ИЗ студентов;
Затем вы должны увидеть двух учеников, возвращенных по этому запросу, как показано ниже:
Обновление SQLite
SQLite UPDATE Query используется для изменения существующих записей в таблице. Вы можете использовать предложение WHERE с запросом UPDATE для обновления выбранных строк. Предложение UPDATE обновляет таблицу, изменяя значение для определенного столбца. Ниже приводится синтаксис предложения UPDATE:
Как следующее:
- После «предложения обновления» вы должны написать имя таблицы для обновления.
- Вы должны написать «предложение SET», которое используется для записи имени столбца для обновления и значения, которое необходимо обновить.
- Вы можете обновить более одного столбца. Между строками можно ставить запятую.
- Вы можете указать предложение WHERE, чтобы указать только некоторые строки. Обновляются только те строки, в которых выражение оценивается как истинное. Если вы не указали предложение WHERE, все строки будут обновлены.
Пример обновления SQLite
В следующем операторе UPDATE мы обновим DepartmentId для Student с StudentId = 6 до 3:
ОБНОВЛЕНИЕ студентовУСТАНОВИТЬ DepartmentId = 3ГДЕ StudentId = 6;
Это должно работать успешно, и вы не должны получать никаких результатов:
В предложении UPDATE мы указали, что хотим обновить таблицу Student.
- В предложении WHERE мы отфильтровали всех студентов, чтобы выбрать только строку для StudentId = 6.
- Предложение SET обновит значение идентификатора отдела для выбранных студентов до 3.
Теперь давайте проверим, что ученик с ID 6 обновлен, выполнив следующую команду:
ВЫБРАТЬ * ИЗ студентов, ГДЕ StudentId = 6;
Теперь вы должны увидеть, что значение идентификатора отдела теперь равно 3:
SQLite Удалить
Запрос SQLite DELETE используется для удаления существующих записей из указанной таблицы. Вы можете использовать предложение WHERE с запросами DELETE для удаления выбранных строк.
Предложение DELETE имеет следующий синтаксис:
- Вы должны написать имя таблицы после предложения DELETE FROM, из которой вы хотите удалить записи. ( Примечание: предложение DELETE используется для удаления некоторых записей из таблицы или удаления всех записей и не удаляет саму таблицу. Однако предложение DROP используется для удаления всей таблицы со всеми записями в ней. )
- Если вы напишете предложение DELETE, например, «DELETE FROM guru», это приведет к удалению всех записей из таблицы «guru».
- Вы можете указать условие WHERE с выражением, если хотите удалить определенные строки. Будут удалены только строки, для которых выражение оценивается как истинное. Например, «УДАЛИТЬ ОТ гуру, ГДЕ id> 5» - это удалит только записи, у которых id больше 5.
Пример
В следующем заявлении мы удалим двух студентов с StudentId 11 и 12:
УДАЛИТЬ ОТ студентов, ГДЕ StudentId = 11 ИЛИ StudentId = 12;
Выражение « StudentId = 11 OR StudentId = 12 » будет истинным только для студентов с идентификаторами 11 и 12. Таким образом, предложение DELETE будет применено к обоим и удалит только их.
Эта команда должна выполняться успешно, и вы не должны получать никаких результатов, как показано ниже:
Вы можете убедиться, что два студента были удалены, выбрав все записи в таблице «Студенты» следующим образом:
ВЫБРАТЬ * ИЗ студентов;
Вы не должны видеть двух студентов с идентификаторами 11 и 12 следующим образом:
Оговорка о конфликте SQLite
Предположим, у вас есть столбец с одним из следующих ограничений столбца: UNIQUE, NOT NULL, CHECK или PRIMARY KEY. А затем вы попытались вставить или обновить значение в этом столбце со значением, которое конфликтует с этим ограничением.
Например, если столбец имеет ограничение UNIQUE, и вы пытались вставить уже существующее значение (повторяющееся значение), которое конфликтует с ограничением UNIQUE. Затем предложение CONFLICT позволяет вам выбрать, что делать в таких случаях для разрешения этого конфликта.
Прежде чем мы продолжим объяснять, как предложение CONFLICT разрешает конфликт. Вы должны понимать, что такое транзакция базы данных.
Транзакция базы данных:
Термин транзакция базы данных - это список операций SQLite (вставка, обновление или удаление). Транзакция базы данных должна выполняться как единое целое, либо все операции выполняются успешно, либо не выполняются вовсе. Все операции будут отменены, если одна из них не будет выполнена.
Пример транзакции с базой данных:
Транзакция по переводу денег с одного банковского счета на другой включает в себя несколько действий. Эта транзакционная операция включает в себя снятие денег с первого счета и их зачисление на другой счет. Эта транзакция должна быть полностью завершена или полностью отменена и не должна завершиться неудачей на полпути.
Вот список из пяти разрешений, которые вы можете выбрать в предложении CONFLICT:
- ROLLBACK - откат транзакции, в которой текущий оператор SQLite имеет конфликт (он отменит всю транзакцию). Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то никакие строки не будут обновлены, 10 строк останутся прежними. Будет выдана ошибка.
- ABORT - это прервет (отменит) только текущий оператор SQLite, в котором есть конфликт, и транзакция не будет отменена. Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то только пятое значение не будет обновлено, а остальные 9 строк будут обновлены. Будет выдана ошибка.
- FAIL - прерывает текущий оператор SQLite, в котором возник конфликт. Однако транзакция не будет продолжена, но будут зафиксированы предыдущие изменения, внесенные в строки, предшествующие строке, в которой возник конфликт. Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то будут обновлены только 4 строки, а другая - нет. Будет выдана ошибка.
- IGNORE - это пропустит строку, содержащую нарушение ограничения, и продолжит обработку других следующих строк оператора SQLite. Например, если вы пытаетесь обновить 10 строк, а пятая строка имеет значение, которое конфликтует с ограничением, то будут обновлены только 4 строки, а другая - нет. Он не будет продолжать обновлять другие строки и останавливаться на строке, которая имеет значение конфликта. Никакой ошибки не будет.
- REPLACE - это зависит от типа ограничения, в котором есть нарушение:
- Когда есть нарушение ограничения для ограничения UNIQUE или PRIMARY KEY. REPLACE заменит строку, вызывающую нарушение, новой вставленной или обновленной строкой.
- При нарушении ограничения NOT NULL предложение REPLACE заменит значение NULL значением по умолчанию для этого столбца. Если столбец не имеет значения по умолчанию, SQLite прервет оператор (оператор будет отменен)
- ЕСЛИ происходит нарушение ограничения CHECK, предложение будет прервано.
Примечание. Приведенные выше 5 решений представляют собой варианты разрешения конфликта. Не обязательно, что то, что применимо для разрешения одного конфликта, применимо для разрешения других типов конфликтов.
Как объявить предложение CONFLICT
Вы можете объявить предложение ON CONFLICT, когда вы определяете ограничение для определения столбца в предложении CREATE TABLE. Используя следующий синтаксис:
Вы можете выбрать одно из пяти способов разрешения конфликта, как объяснялось ранее.
Пример ИГНОРИРОВАНИЯ КОНФЛИКТА
Шаг 1) Создайте новую тему таблицы следующим образом:
СОЗДАТЬ ТАБЛИЦУ [Темы] ([SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE,[SubjectName] NVARCHAR NOT NULL);
Обратите внимание, что мы определили ограничение PRIMARY KEY для столбца SubjectId. Ограничение первичного ключа не позволяет вставить два повторяющихся значения в столбец SubjectId, чтобы все значения в этом столбце были уникальными. Также обратите внимание, что мы выбираем разрешение конфликта « ИГНОРИРОВАТЬ ».
Команда должна работать успешно и ошибок не должно быть:
Шаг 2) Теперь давайте вставим некоторые значения в новые темы таблицы, но со значением, которое нарушает ограничение первичного ключа:
ВСТАВИТЬ В ЦЕННОСТИ предметов (1, «Алгебра»);INSERT INTO Subjects VALUES (2, «Курс базы данных»);INSERT INTO Subjects VALUES (2, «Структуры данных»);INSERT INTO Subjects VALUES (4, 'Алгоритмы');
В этом операторе INSERT мы попытались вставить два курса с одним и тем же идентификатором субъекта первичного ключа 2, что является нарушением ограничения первичного ключа.
Команды должны работать нормально, и вы не должны получать никаких ошибок. Как следующее:
Шаг 3) Выберите все предметы из таблицы следующим образом:
ВЫБРАТЬ * ИЗ субъектов;
Это даст вам список предметов:
Обратите внимание, что вместо 4 строк были вставлены только три предмета « Алгебра, курс баз данных и алгоритмы ».
Строка со значением, нарушающим ограничение первичного ключа, которым является «Структуры данных», была проигнорирована и не вставлена. Однако SQLite продолжает выполнять другие операторы после этой строки.
Шаг 4) УДАЛИТЕ субъекты таблицы, чтобы создать их снова с другим предложением ON CONFLICT для следующего примера, выполнив следующую команду:
DROP TABLE Subjects;
Команда drop удаляет всю таблицу. Субъекты таблиц теперь не существуют.
ПРИ ЗАМЕНЫ КОНФЛИКТА Пример
Шаг 1) Создайте новую тему таблицы следующим образом:
СОЗДАТЬ ТАБЛИЦУ [Темы] ([SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE,[SubjectName] NVARCHAR NOT NULL);
Обратите внимание, что мы определили ограничение PRIMARY KEY для столбца SubjectId. Ограничение первичного ключа не позволяет вставить два повторяющихся значения в столбец SubjectId, чтобы все значения в этом столбце были уникальными.
Также обратите внимание, что мы выбираем вариант разрешения конфликта « ЗАМЕНИТЬ ». Команда должна работать успешно и ошибок не должно быть:
Шаг 2) Теперь давайте вставим некоторые значения в новую таблицу Subjects, но со значением, которое нарушает ограничение первичного ключа:
ВСТАВИТЬ В ЦЕННОСТИ предметов (1, «Алгебра»);INSERT INTO Subjects VALUES (2, «Курс базы данных»);INSERT INTO Subjects VALUES (2, «Структуры данных»);INSERT INTO Subjects VALUES (4, 'Алгоритмы');
В этом операторе INSERT мы попытались вставить два курса с одним и тем же идентификатором субъекта первичного ключа 2, что является нарушением ограничения первичного ключа.
Команды должны работать нормально, и вы не должны получать никаких ошибок. Как следующее:
Шаг 3) Выберите все предметы из таблицы следующим образом:
ВЫБРАТЬ * ИЗ субъектов;
Это даст вам список предметов:
Обратите внимание, что были вставлены только три темы « Алгебра, структуры данных и алгоритмы », тогда как мы пытались вставить 4 строки.
Строка со значением, которое нарушает ограничение первичного ключа, которым является « Структуры данных », заменила значение « Курс базы данных » следующим образом:
- Первые два оператора вставки работают без проблем. Два предмета «Алгебра» и «Курс базы данных» будут вставлены с идентификаторами 1, 2.
- Когда SQLite пытается запустить третий оператор вставки с SubjectId 2 и SubjectName « Структуры данных », он обнаруживает, что уже существует тема с SubjectId = 2. Что является нарушением ограничения первичного ключа, определенного в столбце SubjectId.
- SQLite выберет решение REPLACE для этого конфликта. Он заменяет значение, которое уже существует в таблице субъектов, новым значением из оператора вставки. Таким образом, SubjectName « Курс базы данных » будет заменен на SubjectName « Data Structures ».
Резюме:
Предложения INSERT, UPDATE и DELETE используются для изменения данных в базе данных SQLite. Предложение CONFLICT - это мощное предложение для разрешения любого конфликта между данными и данными, которые необходимо изменить.