SQLite INSERT、UPDATE、DELETE クエリと例

⚡ スマートサマリー

SQLite INSERT, UPDATE, and DELETE statements modify data in a database by adding new rows, changing existing values, and removing records, while the ON CONFLICT clause decides how constraint violations are resolved during those operations.

  • 📝 インサート: The INSERT statement adds one or more new rows, listing target columns and their values with the VALUES clause.
  • 会<XNUMXxEXNUMX><XNUMXxXNUMXF>️️<XNUMXxXNUMXF>️️ UPDATE: The UPDATE statement changes existing column values, using SET for new data and WHERE to target specific rows.
  • 🗑️ DELETE: The DELETE statement removes rows that match a WHERE condition, or every row when the WHERE clause is omitted.
  • ⚠️ Conflict Clause: The ON CONFLICT clause resolves constraint violations through ROLLBACK, ABORT, FAIL, IGNORE, or REPLACE.
  • 🔁 トランザクション: A database transaction groups several operations into one unit that either fully commits or fully cancels.
  • 🤖 AI 支援: AIテキストtoSQLツールとGitHub Copilotが生成する SQLite INSERT, UPDATE, and DELETE statements from plain-English prompts.

SQLite INSERT、UPDATE、DELETE クエリ

Insert, Update & Delete Query in SQLite

のデータ変更句 SQLite INSERT、UPDATE、および DELETE ステートメントです。新しい行の挿入、既存の値の更新、データベースからの行の削除に使用されます。

以下のすべての例では、sqlite3.exe を実行し、サンプル データベースへの接続を次のように開く必要があることに注意してください。

ステップ1) このステップでは、

  • Open My Computer and navigate to the following directory “C:\sqlite” and
  • Then open “sqlite3.exe“:

SQLite クエリ - 挿入、更新、削除

ステップ2) 以下のコマンドを使用して、「TutorialsSampleDB.db」データベースを開きます。

.open TutorialsSampleDB.db

SQLite クエリ - 挿入、更新、削除

これで、データベースに対してあらゆる種類のクエリを実行する準備が整いました。

SQLite INSERT

SQLite INSERT は、データベースの指定されたテーブルにレコードを挿入するために使用されます。 「INSERT」句を使用する必要があります。 INSERT 句の構文は次のとおりです。

SQLite INSERT

  • INSERT 句の後に、どのテーブルに値を挿入する必要があるかを指定する必要があります。
  • テーブル名の後に、値を挿入する列のリストを記述します。
  • 列名は無視して、書き込まなくても問題ありません。
  • 列名を記述しない場合、値はテーブル内にあるすべての列に同じ順序で挿入され、列はテーブル内で定義されます。
  • VALUES 句の後に、挿入する値をリストする必要があります。
  • 各 INSERT 句は XNUMX 行のみを挿入します。 複数の行を挿入する場合は、行ごとに XNUMX つずつ、複数の INSERT 句を記述する必要があります。

SQLite 挿入例

次の例では、学生テーブルに学生ごとに 2 行ずつ、合計 XNUMX 行を挿入します。

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 インサート

これにより XNUMX 人の学生が挿入されます。

  • StudentId=11、StudentName=Ahmad、DepartmentId=4、DateOfBirth=1997-10-12 の最初の学生。
  • The second student with StudentId=12, StudentName = Aly, DepartmentId = 4, and DateOfBirth = 1996-10-12’.

In the first statement, we listed the columns names “StudentId, StudentName, DepartmentId, DateOfBirth“.However, in the second statement, we didn’t.

The four values “12, ‘Aly’, 4, ‘1996-10-12’” will be inserted in all the four columns of the Students table in the same order the columns are defined.

さて、次のコードを実行して、2人の学生がStudentsテーブルに挿入されたことを確認しましょう。 クエリー:

SELECT * FROM Students;

すると、そのクエリから返された 2 人の学生が次のように表示されます。

SQLite インサート

SQLite 更新

SQLite UPDATE クエリは、テーブル内の既存のレコードを変更するために使用されます。UPDATE クエリで WHERE 句を使用して、選択した行を更新できます。UPDATE 句は、特定の列の値を変更してテーブルを更新します。UPDATE 句の構文は次のとおりです。

SQLite 更新

以下の通りです:

  • 「update句」の後には更新するテーブル名を記述します。
  • 更新する列名と更新する値を記述する「SET句」を記述します。
  • 複数の列を更新できます。 各行の間にカンマを使用できます。
  • WHERE 句を指定して、一部の行のみを指定できます。 式が true と評価した行のみが更新されます。 WHERE 句を指定しなかった場合は、すべての行が更新されます。

SQLite 更新例

次の UPDATE ステートメントでは、StudentId = 6 の学生の DepartmentId を 3 に更新します。

UPDATE Students
SET DepartmentId = 3 
WHERE StudentId = 6;

これは正常に実行され、何も出力されないはずです。

SQLite 更新

UPDATE 句では、Students テーブルを更新することを指定しました。

  • WHERE 句では、すべての学生をフィルタリングして StudentId = 6 の行のみを選択しました。
  • SET 句は、選択した学生の学科 ID の値を 3 に更新します。

ここで、次のコマンドを実行して、ID 6 の学生が更新されたことを確認しましょう。

SELECT * FROM Students WHERE StudentId = 6;

次のように、Department Id の値が 3 になっていることがわかります。

SQLite 更新

SQLite 削除

SQLite DELETE クエリは、指定されたテーブルから既存のレコードを削除するために使用されます。 DELETE クエリで WHERE 句を使用すると、選択した行を削除できます。

DELETE 句の構文は次のとおりです。

SQLite 削除

  • You have to write a table name after the DELETE FROM clause, from which you want to delete records. (Note: that the DELETE clause is used to delete some records from a table or delete all the records and it won’t delete the table itself. However, the DROP clause is used to delete the entire table with all the records on it.)
  • この「DELETE FROM guru」のように DELETE 句を書くと、テーブル「guru」からすべてのレコードが削除されます。
  • 特定の行を削除する場合は、式で WHERE 条件を指定できます。 式が true と評価された行のみが削除されます。 たとえば、「DELETE FROM guru WHERE id > 5」 – これにより、ID が 5 より大きいレコードのみが削除されます。

例:

次のステートメントでは、StudentId 11 と 12 の XNUMX 人の学生を削除します。

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

The expression “StudentId = 11 OR StudentId = 12” will be true for only students with Ids 11 and 12. So the DELETE clause will be applied on both and will delete them only.

このコマンドは正常に実行され、次のような出力は表示されません。

SQLite 削除

次のように Students テーブルからすべてのレコードを選択すると、2 人の学生が削除されたことを確認できます。

SELECT * FROM Students;

次のように、ID 11 と 12 を持つ XNUMX 人の学生は表示されないはずです。

SQLite 削除

SQLite 紛争条項

UNIQUE、NOT NULL、CHECK、または PRIMARY KEY のいずれかの列制約を持つ列があるとします。そして、この制約と競合する値を使用して、その列に値を挿入または更新しようとしました。

たとえば、列に UNIQUE 制約があり、UNIQUE 制約と競合するすでに存在する値 (重複値) を挿入しようとした場合です。 次に、CONFLICT 句を使用すると、このような場合にこの競合を解決するために何を行うかを選択できます。

CONFLICT 句が競合を解決する方法を説明する前に。 データベース トランザクションとは何かを理解する必要があります。

データベーストランザクション

データベース トランザクションという用語は、次のリストです。 SQLite 操作 (挿入、更新、削除)。データベース トランザクションは 1 つの単位として実行される必要があり、すべての操作が正常に実行されるか、まったく実行されないかのいずれかになります。いずれかの操作の実行に失敗した場合、すべての操作がキャンセルされます。

データベーストランザクションの例

ある銀行口座から別の銀行口座に送金する取引には、いくつかのアクティビティが含まれます。この取引操作には、最初の口座からの資金の引き出しと、別の口座への入金が含まれます。この取引は完全に完了するか、完全にキャンセルする必要があり、途中で失敗してはなりません。

CONFLICT 句で選択できる XNUMX つの解決策のリストは次のとおりです。

  1. ROLLBACK – this will roll back the transaction in which the current SQLite 競合するステートメント (トランザクション全体がキャンセルされます)。たとえば、10 行を更新しようとしていて、10 行目に制約と競合する値がある場合、どの行も更新されず、XNUMX 行は同じままになります。エラーがスローされます。
  2. ABORT – this will abort (cancel) the current SQLite 競合するステートメントのみを削除すると、トランザクションはキャンセルされません。たとえば、10 行を更新しようとしていて、9 行目に制約と矛盾する値が含まれている場合、XNUMX 番目の値だけが更新されず、他の XNUMX 行は更新されます。エラーがスローされます。
  3. FAIL – aborts the current SQLite 矛盾のあるステートメント。ただし、トランザクションは続行されませんが、競合している行よりも前の行に加えられた変更はコミットされます。たとえば、10 行を更新しようとしていて、4 行目に制約と競合する値が含まれている場合、XNUMX 行のみが更新され、他の行は更新されません。エラーがスローされます。
  4. IGNORE – this will skip the row that contains the constraint violation and continue processing the other following rows of the SQLite 声明。たとえば、10 行を更新しようとしていて、4 行目に制約と競合する値が含まれている場合、XNUMX 行のみが更新され、他の行は更新されません。他の行の更新には続行せず、競合値を持つ行で停止します。エラーはスローされません。
  5. REPLACE – it depends on the type of constraint that has the violation:
    • UNIQUE または PRIMARY KEY 制約の制約違反がある場合。 REPLACE は、違反の原因となった行を、新しく挿入または更新された行に置き換えます。
    • NOT NULL 制約違反がある場合、REPLACE 句は NULL 値をその列のデフォルト値に置き換えます。列にデフォルト値がない場合は、 SQLite ステートメントは中止されます (ステートメントはキャンセルされます)
    • CHECK 制約違反が発生した場合、句は中止されます。

Note: The above 5 resolutions are options for how do you want to resolve the conflict. It may not be necessarily what is applicable to resolve one conflict is applicable to resolve other types of conflicts.

CONFLICT句の宣言方法

CREATE TABLE 句内で列定義の制約を定義するときに、ON CONFLICT 句を宣言できます。次の構文を使用します。

SQLite 紛争条項

前に説明したように、XNUMX つの解決策から XNUMX つを選択して競合を解決できます。

競合時無視の例

ステップ1) 次のように新しいテーブル サブジェクトを作成します。

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

Notice that we have defined a PRIMARY KEY constraint on the SubjectId column. The primary key constraint won’t allow two duplicated values to be inserted into the SubjectId column so that all the values in that column should be unique. Also, notice that we choose a conflict resolution to be “IGNORE“.

コマンドは正常に実行され、エラーは発生しないはずです。

競合時無視の例

ステップ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 ステートメントでは、同じ主キー件名 ID 2 を持つ XNUMX つのコースを挿入しようとしましたが、これは主キー制約の違反です。

コマンドは正常に実行され、エラーは発生しないはずです。次のようになります。

競合時無視の例

ステップ3) 次のように、表からすべての主題を選択します。

SELECT * FROM Subjects;

これにより、件名のリストが表示されます。

競合時無視の例

Notice that only three subjects were inserted “Algebra, Database Course, and Algorithms” 4行の代わりに。

主キー制約に違反する値を持つ行、つまり「データ構造」は無視され、挿入されませんでした。 しかし、 SQLite その行の後に他のステートメントの実行を続けます。

ステップ4) テーブル subject を DELETE し、以下のコマンドを実行して、次の例のように別の ON CONFLICT 句でテーブル subject を再度作成します。

DROP TABLE Subjects;

Drop コマンドはテーブル全体を削除します。 Table Subjects は現在存在しません。

競合時の置換の例

ステップ1) 次のように新しいテーブル サブジェクトを作成します。

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

SubjectId 列に PRIMARY KEY 制約を定義したことに注意してください。 主キー制約では、XNUMX つの重複した値を SubjectId 列に挿入することはできないため、その列内のすべての値は一意である必要があります。

Also, notice that we choose a conflict resolution option to be “REPLACE“. The command should run successfully and you shouldn’t get any errors:

競合時の置換の例

ステップ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 ステートメントでは、同じ主キー件名 ID 2 を持つ XNUMX つのコースを挿入しようとしましたが、これは主キー制約の違反です。

コマンドは正常に実行され、エラーは発生しないはずです。次のようになります。

競合時の置換の例

ステップ3) 次のように、表からすべての主題を選択します。

SELECT * FROM Subjects;

これにより、件名のリストが表示されます。

競合時の置換の例

Notice that only three subjects were inserted “Algebra, Data Structures, and Algorithms” 一方、私たちは 4 行を挿入しようとしました。

The row that has the value that violates the primary key constraint, which is “Data Structures” replaced the value “Database Course” as following:

  • 最初の 1 つの挿入ステートメントは問題なく正常に実行されます。 2 つの科目代数とデータベース コースが ID XNUMX、XNUMX で挿入されます。
  •    SQLite tries to run the third insert statement with SubjectId 2 and SubjectName “Data Structures“, it finds out that there is already a subject with SubjectId = 2. Which is a violation for the primary key constraint defined on the SubjectId column.
  • SQLite will choose a REPLACE resolution for this conflict. It replaces the value that already exists in the subjects table with the new value from the insert statement. So, the “Database Course” SubjectName will be replaced with “Data Structures” SubjectName.

よくあるご質問

UPSERT combines insert and update. Since SQLite 3.24.0 (2018), INSERT INTO … ON CONFLICT(column) DO UPDATE SET … inserts a new row, or updates the existing one when a UNIQUE or PRIMARY KEY conflict occurs. DO NOTHING skips the row silently instead.

INSERT OR REPLACE deletes the conflicting row and inserts a new one, so unlisted columns reset to their defaults. ON CONFLICT DO UPDATE edits the existing row in place, keeping other columns intact, which makes it the safer true upsert.

List several value groups after VALUES, separated by commas: INSERT INTO Students (id, name) VALUES (1,’A’), (2,’B’), (3,’C’);. This multi-row form works since SQLite 3.7.11 and is faster than running one INSERT statement per row.

Run DELETE FROM table_name; without a WHERE clause. SQLite has no TRUNCATE command, but it applies a truncate optimization that drops all rows at once. The table structure stays; use DROP TABLE to remove the table entirely.

Since SQLite 3.35.0 (2021), INSERT, UPDATE, and DELETE accept an optional RETURNING clause that outputs the affected rows. For example, INSERT … RETURNING id; returns generated values immediately, avoiding a separate SELECT to read what changed.

Use INSERT INTO … SELECT: INSERT INTO Archive (id, name) SELECT id, name FROM Students WHERE DepartmentId = 4;. SQLite inserts every row the SELECT returns, so the column order and count must match the target table.

Yes. AI text-to-SQL assistants convert plain-English requests into SQLite INSERT, UPDATE, and DELETE statements, including WHERE and ON CONFLICT clauses. Supplying your table and column names improves accuracy, and every generated statement should be reviewed and tested before running on real data.

GitHubコパイロット 提案する SQLite INSERT, UPDATE, and DELETE queries inline in editors like VS Code. It reads nearby schema and comments, so completions reuse your real table and column names, but you should still verify each statement before executing.