update sqlite-如何讓INSERT或IGNORE工作




sqlite insert where (2)

我正在嘗試將數據插入表中。 如果列沒有數據,我想插入行 - 無論其他列如何。

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

根據上面的代碼片段,我最終會得到3行,而不是我想像的那樣。 如果重要的是實際的sql發生在INSTEAD OF INSERT觸發器內部,這只是一個簡單的測試用例。


更換

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|

這只適用於主鍵字段或唯一約束:

可選的conflict-clause允許在此一個INSERT命令期間指定備用約束衝突解決算法。

進一步:

ON CONFLICT子句適用於UNIQUE和NOT NULL約束(以及PRIMARY KEY約束,出於本節的目的,它們與UNIQUE約束相同)。 ON CONFLICT算法不適用於FOREIGN KEY約束。 有五種衝突解決算法選擇:ROLLBACK,ABORT,FAIL,IGNORE和REPLACE。 默認衝突解決算法是ABORT。





sqlite