INSERT OR IGNORE INTO를 사용하면 동일한 PRIMARY KEY가 이미 있을 경우는 무시하고 명령어를 실행한다.
sqlite> CREATE TABLE IF NOT EXISTS User(Id INTEGER PRIMARY KEY,Name TEXT);
sqlite> INSERT INTO User VALUES(1,'Jeff'),(3,'John');
sqlite> INSERT INTO User VALUES(1,'Jiff'),(2,'Smith'),(3,'Julia'),(4,'Kotlin');
Runtime error: UNIQUE constraint failed: User.Id (19)
sqlite> INSERT OR IGNORE INTO User VALUES(1,'Jiff'),(2,'Smith'),(3,'Julia'),(4,'Kotlin');
sqlite> SELECT * FROM User;
1|Jeff
2|Smith
3|John
4|Kotlin
또한, 다음과 같이 ON CONFLICT DO UPDATE SET column1=value1, column2=value2, ... 구문을 사용하여 동일한 PRIMARY KEY로 충돌 시 자신이 원하는 column의 값을 업데이트할 수도 있다.
sqlite> INSERT INTO User(Id,Name) VALUES(1,'Jiff'),(2,'Smiss'),(4,'Python'),(5,'C#') ON CONFLICT DO UPDATE SET Name=excluded.Name;
sqlite> SELECT * FROM User;
1|Jiff
2|Smiss
3|John
4|Python
5|C#
2줄 요약
- PK 충돌 시 값 그대로 유지 -> INSERT OR IGNORE INTO 사용
- PK 충돌 시 값 업데이트 -> ON CONFLICT DO UPDATE SET 사용
Reference
https://mine-it-record.tistory.com/270
https://stackoverflow.com/a/58638892/14367566
https://www.sqlite.org/lang_upsert.html