SQLiteでは、テーブルに複数の行を挿入しようとしたときに、それらの行のいずれかがそのテーブルの制約に違反すると、操作は失敗します。
結局のところ、これが制約の目的です。
しかし、制約に違反する行を無視したい場合はどうでしょうか。つまり、行が制約に違反している場合は、SQLiteでその行をスキップしてから、次の行の処理を続行する必要があります。
幸い、SQLiteでこれを行う簡単な方法があります。
紛争条項
SQLiteにはON CONFLICT
があります 制約の競合を処理する方法を指定できる句。具体的には、UNIQUE
に適用されます 、NOT NULL
、CHECK
、およびPRIMARY KEY
制約(ただし、FOREIGN KEY
は不可) 制約)。
ON CONFLICT
句はCREATE TABLE
で使用されます ステートメントですが、データを挿入すると、句はOR
に置き換えられます 。
したがって、この句を使用して、データを挿入するときに制約違反を処理する方法を決定できます。
この句で使用できる値は5つあります。
-
ROLLBACK
-
ABORT
-
FAIL
-
IGNORE
-
REPLACE
この記事では、IGNORE
を使用します オプション。
IGNORE
を使用する SQLiteは、制約違反を含む1行をスキップし、何も問題がなかったかのように後続の行の処理を続行します。
例
これがCREATE TABLE
です 製品というテーブルのステートメント :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
このテーブルにはNOT NULL
が含まれていることに注意してください ProductNameの制約 列。
それでは、その制約に違反するデータを挿入してみましょう。
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
結果:
Error: NOT NULL constraint failed: Products.ProductName
当然のことながら、NOT NULL
を示すエラーが発生します 制約に違反しました。
次に、テーブルに挿入された行数を見てみましょう。
SELECT COUNT(*) FROM Products;
結果:
0
したがって、2行目のみが制約に違反していることがわかりますが、これにより 挿入されないデータ。
これを変更するには、OR IGNORE
を追加します INSERT
に ステートメント:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
必要なのはそれだけです。このコードを実行しても、前のコードのようなエラーは発生しません。このコードを実行すると、良いデータが挿入され、悪いデータは無視されます。
ここで、SELECT
を実行すると テーブルに対するステートメントを見ると、実際に適切なデータが挿入されていることがわかります。
SELECT * FROM Products;
結果:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75>