SQLite INSERT、UPDATE、DELETE クエリと例

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

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

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

  1. マイコンピュータを開き、次のディレクトリに移動します。C:\sqlite"と
  2. 次に「」を開きますsqlite3.exe"

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

ステップ2) データベースを開きます」チュートリアルSampleDB.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 の最初の学生。
  • 12 番目の学生は StudentId=4、StudentName = Aly、DepartmentId = 1996、DateOfBirth = 10-12-XNUMX' です。

最初のステートメントでは、列名をリストしました。StudentId、StudentName、DepartmentId、DateOfBirth「。しかし、XNUMX番目の声明では、そうではありませんでした。

XNUMXつの価値観」12、「アリー」、4、「1996-10-12」」は、列が定義されているのと同じ順序で、Students テーブルの XNUMX つの列すべてに挿入されます。

さて、次のコードを実行して、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 削除

  • DELETE FROM 句の後に、レコードを削除するテーブル名を記述する必要があります。 (ご注意: その DELETE 句 はテーブルから一部のレコードを削除するか、すべてのレコードを削除するために使用されますが、テーブル自体は削除されません。 しかし DROP 句 すべてのレコードを含むテーブル全体を削除するために使用されます。)
  • この「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;

表現 "StudentId = 11 または StudentId = 12」は、ID 11 と 12 を持つ学生のみに当てはまります。したがって、DELETE 句は両方に適用され、それらのみを削除します。

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

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. ロールバック – これにより、現在のトランザクションがロールバックされます。 SQLite 競合するステートメント (トランザクション全体がキャンセルされます)。たとえば、10 行を更新しようとしていて、10 行目に制約と競合する値がある場合、どの行も更新されず、XNUMX 行は同じままになります。エラーがスローされます。
  2. アボート – これにより、現在の処理が中止(キャンセル)されます。 SQLite 競合するステートメントのみを削除すると、トランザクションはキャンセルされません。たとえば、10 行を更新しようとしていて、9 行目に制約と矛盾する値が含まれている場合、XNUMX 番目の値だけが更新されず、他の XNUMX 行は更新されます。エラーがスローされます。
  3. 失敗 - 現在を中止します SQLite 矛盾のあるステートメント。ただし、トランザクションは続行されませんが、競合している行よりも前の行に加えられた変更はコミットされます。たとえば、10 行を更新しようとしていて、4 行目に制約と競合する値が含まれている場合、XNUMX 行のみが更新され、他の行は更新されません。エラーがスローされます。
  1. IGNORE – 制約違反を含む行をスキップし、次の行の処理を続行します。 SQLite 声明。たとえば、10 行を更新しようとしていて、4 行目に制約と競合する値が含まれている場合、XNUMX 行のみが更新され、他の行は更新されません。他の行の更新には続行せず、競合値を持つ行で停止します。エラーはスローされません。
  1. REPLACE – それは、違反のある制約のタイプによって異なります。
  • UNIQUE または PRIMARY KEY 制約の制約違反がある場合。 REPLACE は、違反の原因となった行を、新しく挿入または更新された行に置き換えます。
  • NOT NULL 制約違反がある場合、REPLACE 句は NULL 値をその列のデフォルト値に置き換えます。列にデフォルト値がない場合は、 SQLite ステートメントは中止されます (ステートメントはキャンセルされます)
  • CHECK 制約違反が発生した場合、句は中止されます。

ご注意: 上記の 5 つの解決策は、競合をどのように解決するかに関するオプションです。 ある競合の解決に適用できるものが、他のタイプの競合の解決にも適用できるとは限りません。

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
);

SubjectId 列に PRIMARY KEY 制約を定義していることに注意してください。 主キー制約では、XNUMX つの重複した値を SubjectId 列に挿入することはできないため、その列内のすべての値は一意である必要があります。 また、競合解決として「」を選択していることにも注目してください。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;

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

競合時無視の例

挿入された件名が XNUMX つだけであることに注意してください。代数、データベースコース、 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 列に挿入することはできないため、その列内のすべての値は一意である必要があります。

また、競合解決オプションとして「」を選択していることに注意してください。REPLACE”。 コマンドは正常に実行され、エラーは発生しないはずです。

競合時の置換の例

ステップ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;

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

競合時の置換の例

挿入された件名が XNUMX つだけであることに注意してください。代数、データ構造、および Algorithms” 一方、私たちは 4 行を挿入しようとしました。

主キー制約に違反する値を持つ行、つまり「データ構造” は値” を置き換えましたデータベースコース” は以下のようになります。

  • 最初の 1 つの挿入ステートメントは問題なく正常に実行されます。 2 つの科目代数とデータベース コースが ID XNUMX、XNUMX で挿入されます。
  • 日時 SQLite SubjectId 2 と SubjectName を使用して XNUMX 番目の挿入ステートメントを実行しようとします。データ構造これは、SubjectId 列に定義された主キー制約に対する違反です。
  • SQLite この競合に対して REPLACE 解決策を選択します。これは、subject テーブルに既に存在する値を、insert ステートメントからの新しい値に置き換えます。それで、「」データベースコース「 SubjectName は「」に置き換えられますデータ構造” 件名名。

まとめ

INSERT、UPDATE、および DELETE 句は、ファイル内のデータを変更するために使用されます。 SQLite データベース。 CONFLICT 句は、データと変更するデータの間の競合を解決する強力な句です。