74

テーブルにデータを挿入しようとしています。他の列に関係なく、列にまだデータがない場合は、行を挿入したいと思います。

CREATE TABLE t (
    id          INTEGER PRIMARY KEY,
    name        VARCHAR,
    other       INT
);
INSERT OR IGNORE INTO t (name) VALUES ('a');
INSERT OR IGNORE INTO t (name) VALUES ('a');
INSERT OR IGNORE INTO t (name) VALUES ('a');

上記のスニペットを使用すると、思ったように1行ではなく、3行になります。実際のSQLがINSTEAD OF INSERTトリガー内で発生していることが重要な場合、これは単純なテストケースです。

4

2 に答える 2

124

交換

CREATE TABLE t (
    id          INTEGER PRIMARY KEY,
    name        VARCHAR,
    other       INT
);

CREATE TABLE t (
    id          INTEGER PRIMARY KEY,
    name        VARCHAR UNIQUE,
    other       INT
);

それからあなたは得るでしょう

sqlite> CREATE TABLE t (
   ...>     id          INTEGER PRIMARY KEY,
   ...>     name        VARCHAR UNIQUE,
   ...>     other       INT
   ...> );
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a');
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a');
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a');
sqlite> select * from t ;
1|a|
于 2012-08-24T07:58:51.240 に答える
23

これは、主キー フィールドまたは一意の制約に対してのみ機能します。

オプションの conflict-clause を使用すると、この 1 つのINSERTコマンドで使用する別の制約競合解決アルゴリズムを指定できます。

さらに遠く:

ON CONFLICT句は、UNIQUE および NOT NULL 制約 (および、このセクションの目的では UNIQUE 制約と同じである PRIMARY KEY 制約) に適用されます。ON CONFLICT アルゴリズムは FOREIGN KEY 制約には適用されません。競合解決アルゴリズムには、ROLLBACK、ABORT、FAIL、IGNORE、および REPLACE の 5 つの選択肢があります。デフォルトの競合解決アルゴリズムは ABORT です。

于 2012-08-24T07:59:55.763 に答える