Cách thực hiện NẾU KHÔNG TỒN TẠI SQLite


80

Tôi đang cố gắng chuyển dòng này từ MS SQL Server sang SQLite

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');

Có vẻ như SQLite không hỗ trợ NẾU KHÔNG TỒN TẠI hoặc ít nhất là tôi không thể làm cho nó hoạt động. Tôi đang thiếu một cái gì đó đơn giản? Có một giải pháp thay thế?

Câu trả lời:


120

Còn cái này thì sao?

INSERT OR IGNORE INTO EVENTTYPE (EventTypeName) VALUES 'ANI Received'

(Chưa được kiểm tra vì tôi không có SQLite ... tuy nhiên liên kết này khá mô tả.)

Ngoài ra, điều này cũng sẽ hoạt động:

INSERT INTO EVENTTYPE (EventTypeName)
SELECT 'ANI Received'
WHERE NOT EXISTS (SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received');

14
Cảm ơn. Tuy nhiên, cần lưu ý rằng phần CHÈN HOẶC BỎ QUA chỉ hoạt động nếu EventTypeName được đặt là duy nhất.
AngryHacker

2
Thật. Tôi cho rằng nó là duy nhất dựa trên cách nó được sử dụng trong SQL mẫu. Nếu không, phương pháp thứ hai nên được sử dụng.
bãi biển

Phương pháp thứ hai thực sự có thể được sử dụng nếu EventTypeName không phải là duy nhất? Tôi đang cố gắng làm điều gì đó tương tự và tôi thấy rằng mệnh đề SELECT WHERE NOT EXISTS trả về nhiều hàng, trên thực tế mọi hàng trong đó (tương đương với) EventTypeName! = 'ANI Received' đều đúng.
Michael

Mục đích là EventTypeName là duy nhất. Giá trị mới 'ANI đã nhận' chỉ được chèn vào bảng EVENTTYPE nếu nó chưa tồn tại trong bảng. Đây là điều mà mệnh đề WHERE NOT EXISTS xuất hiện. Mệnh đề SELECT WHERE NOT EXISTS chỉ có thể trả về một hàng duy nhất; không có mệnh đề FROM - không có cách nào có thể trả về nhiều hàng. Hi vọng điều này sẽ làm sáng tỏ nó.
beach

1
Đây là phong cách mã hóa rất tệ. Đối với mọi lỗi, truy vấn sẽ âm thầm không thành công! Từ tài liệu: IGNOREKhi vi phạm ràng buộc có thể áp dụng xảy ra, thuật toán giải quyết BỎ QUA bỏ qua một hàng chứa vi phạm ràng buộc và tiếp tục xử lý các hàng tiếp theo của câu lệnh SQL như thể không có gì sai. Các hàng khác trước và sau hàng có vi phạm ràng buộc được chèn hoặc cập nhật bình thường. Không có lỗi nào được trả lại khi sử dụng thuật toán giải quyết xung đột BỎ QUA.
ManuelSchneid3r

12

Nếu bạn muốn bỏ qua việc chèn giá trị hiện có, phải có trường Khóa trong Bảng của bạn. Chỉ cần tạo một bảng Với Trường Khóa Chính Như:

CREATE TABLE IF NOT EXISTS TblUsers (UserId INTEGER PRIMARY KEY, UserName varchar(100), ContactName varchar(100),Password varchar(100));

Và sau đó chèn hoặc thay thế / chèn hoặc bỏ qua truy vấn trên bảng như:

INSERT OR REPLACE INTO TblUsers (UserId, UserName, ContactName ,Password) VALUES('1','UserName','ContactName','Password');

Nó sẽ không để nó nhập lại giá trị khóa chính hiện có ... Đây là cách bạn có thể kiểm tra xem một giá trị có tồn tại trong bảng hay không.


1

Bạn cũng có thể đặt Ràng buộc trên Bảng với các trường KEY và đặt Khi xung đột là "Bỏ qua"

Khi vi phạm ràng buộc có thể áp dụng xảy ra, thuật toán giải quyết BỎ QUA sẽ bỏ qua một hàng có chứa vi phạm ràng buộc và tiếp tục xử lý các hàng tiếp theo của câu lệnh SQL như thể không có gì sai. Các hàng khác trước và sau hàng có vi phạm ràng buộc được chèn hoặc cập nhật bình thường. Không có lỗi nào được trả lại khi sử dụng thuật toán giải quyết xung đột BỎ QUA.

Tài liệu SQLite

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.