2012-08-24 29 views
38

Tôi đang cố chèn dữ liệu vào một bảng. Tôi muốn chèn hàng nếu cột không có dữ liệu - bất kể các cột khác.sqlite - Cách lấy INSERT HOẶC IGNORE để làm việc

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

Với đoạn mã trên, tôi kết thúc bằng 3 hàng, không phải 1 như tôi đã nghĩ. Nếu nó quan trọng sql thực tế đang xảy ra bên trong của một kích hoạt INSTEAD OF INSERT, đây chỉ là một trường hợp thử nghiệm đơn giản.

Trả lời

65

Thay

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

với

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

Sau đó, bạn sẽ nhận được

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| 
9

Điều đó sẽ chỉ làm việc cho trường khóa chính hoặc ràng buộc duy nhất:

Mệnh đề xung đột tùy chọn cho phép đặc tả của thuật toán giải quyết xung đột hạn chế thay thế để sử dụng trong lệnh này INSERT.

Tiếp tục:

Mệnh ON CONFLICT áp dụng cho duy nhất và không hạn chế về NULL (và chế PRIMARY KEY đó cho các mục đích của phần này là những điều tương tự như những hạn chế UNIQUE). Thuật toán ON CONFLICT không áp dụng cho các ràng buộc KEY NGOẠI TỆ. Có năm xung đột lựa chọn thuật toán giải pháp: ROLLBACK, ABORT, FAIL, IGNORE và THAY THẾ. Thuật toán giải quyết xung đột mặc định là ABORT.

Các vấn đề liên quan