SQLite INSERT、UPDATE、DELETE クエリと例

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

すべてのフォローについては、wing たとえば、sqlite3.exe を実行し、flo としてサンプル データベースへの接続を開く必要があります。wing:

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

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

SQLite クエリ - INSERT、UPDATE、DELETE

ステップ2) データベースを開きます」チュートリアルSampleDB.db” by フォローwing コマンド:

.open TutorialsSampleDB.db

SQLite クエリ - INSERT、UPDATE、DELETE

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

SQLiteの挿入

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

SQLiteの挿入

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

SQLiteの挿入例

続きましてwing たとえば、学生テーブルに各学生に 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 つの列すべてに挿入されます。

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

SELECT * FROM Students;

次に、次のようにクエリから返された XNUMX 人の学生が表示されるはずです。wing:

SQLiteの挿入

SQLiteのアップデート

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

SQLiteのアップデート

以下のようにwing:

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

SQLite 更新の例

続きましてwing UPDATE ステートメントでは、StudentId = 6 の Student のDepartmentId を 3 に更新します。

UPDATE Students
SET DepartmentId = 3 
WHERE StudentId = 6;

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

SQLiteのアップデート

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

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

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

SELECT * FROM Students WHERE StudentId = 6;

次のように、部門 ID の値が 3 になっていることがわかります。wing:

SQLiteのアップデート

SQLiteの削除

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

DELETE 句には次のようなものがありますwing 構文:

SQLiteの削除

  • DELETE FROM 句の後に、レコードを削除するテーブル名を記述する必要があります。 (注: その DELETE 句 はテーブルから一部のレコードを削除するか、すべてのレコードを削除するために使用されますが、テーブル自体は削除されません。 しかし DROP 句 すべてのレコードを含むテーブル全体を削除するために使用されます。)
  • この「DELETE FROM guru」のように DELETE 句を書くと、テーブル「guru」からすべてのレコードが削除されます。
  • 特定の行を削除する場合は、式で WHERE 条件を指定できます。 式が true と評価された行のみが削除されます。 たとえば、「DELETE FROM guru WHERE id > 5」 – これにより、ID が 5 より大きいレコードのみが削除されます。

続きましてwing ステートメントでは、StudentId 11 と 12 を持つ XNUMX 人の学生を削除します。

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

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

このコマンドは正常に実行され、次のように何も出力されないはずです。wing:

SQLiteの削除

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

SELECT * FROM Students;

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

SQLiteの削除

SQLite の競合条項

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

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

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

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

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

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

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

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

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

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

CONFLICT句の宣言方法

ON CONFLICT 句は、CREATE TABLE 句内の列定義の制約を定義するときに宣言できます。 フォローを使用するwing 構文:

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 つのコースを挿入しようとしましたが、これは主キー制約の違反です。

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

競合時無視の例

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

SELECT * FROM Subjects;

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

競合時無視の例

挿入された件名が XNUMX つだけであることに注意してください。代数、データベースコース、アルゴリズム” 4行の代わりに。

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

ステップ4) テーブル サブジェクトを DELETE して、次のように別の ON CONFLICT 句を使用してテーブル サブジェクトを再作成します。wing たとえば次のように実行しますwing コマンド:

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 つのコースを挿入しようとしましたが、これは主キー制約の違反です。

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

競合時の置換の例

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

SELECT * FROM Subjects;

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

競合時の置換の例

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

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

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

まとめ

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