sql >> データベース >  >> RDS >> SQLite

SQLiteにデータを挿入するときに制約に違反する行をスキップする方法

    SQLiteでは、テーブルに複数の行を挿入しようとしたときに、それらの行のいずれかがそのテーブルの制約に違反すると、操作は失敗します。

    結局のところ、これが制約の目的です。

    しかし、制約に違反する行を無視したい場合はどうでしょうか。つまり、行が制約に違反している場合は、SQLiteでその行をスキップしてから、次の行の処理を続行する必要があります。

    幸い、SQLiteでこれを行う簡単な方法があります。

    紛争条項

    SQLiteにはON CONFLICTがあります 制約の競合を処理する方法を指定できる句。具体的には、UNIQUEに適用されます 、NOT NULLCHECK 、および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     
    >


    1. psql:致命的:ユーザーpostgresのID認証に失敗しました

    2. ORA-01008:すべての変数がバインドされているわけではありません。彼らは縛られている

    3. 外部キー制約は、Oracleのクエリ変換に影響を与えますか?

    4. Oracleで複数行の挿入を行う最良の方法は?