UFO ET IT

sqlite-INSERT 또는 IGNORE가 작동하도록하는 방법

ufoet 2021. 1. 14. 07:49
반응형

sqlite-INSERT 또는 IGNORE가 작동하도록하는 방법


테이블에 데이터를 삽입하려고합니다. 다른 열에 관계없이 열에 데이터가없는 경우 행을 삽입하고 싶습니다.

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트리거 내부에서 발생하는 것이 중요하다면 이것은 단순한 테스트 사례입니다.


바꾸다

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|

이는 기본 키 필드 또는 고유 제약 조건에서만 작동합니다.

선택적인 충돌 절은이 하나의 INSERT 명령 동안 사용할 대체 제약 충돌 해결 알고리즘의 사양을 허용합니다 .

더욱이:

ON 충돌 절은 UNIQUE와 NOT NULL 제약 (이 섹션의 목적을 위해 UNIQUE 제약과 같은 일이다 PRIMARY KEY 제약에)을 적용합니다. ON CONFLICT 알고리즘은 FOREIGN KEY 제약 조건에 적용되지 않습니다. ROLLBACK, ABORT, FAIL, IGNORE 및 REPLACE의 다섯 가지 충돌 해결 알고리즘 선택이 있습니다. 기본 충돌 해결 알고리즘은 ABORT입니다.

참조 URL : https://stackoverflow.com/questions/12105198/sqlite-how-to-get-insert-or-ignore-to-work

반응형