2010-06-25 37 views
7

Tôi đang làm việc với một số mã. Có một số truy vấn có hiệu lực, nếu hàng tồn tại với một số dữ liệu được điền vào, thì hàng đó được cập nhật với phần còn lại của dữ liệu và nếu hàng không tồn tại thì hàng mới sẽ được tạo. Chúng trông giống như sau:Truy vấn SQL này cập nhật một hàng nếu tồn tại, hoặc chèn nếu không, làm việc?

 
INSERT INTO table_name (col1, col2, col3) 
SELECT %s AS COL1, %s AS COL2, %s AS COL3 
FROM (SELECT %s AS COL1, %s AS COL2, %s AS COL3) A 
LEFT JOIN table_name B 
ON B.COL1 = %s 
AND B.COL2 = %s  --note: doesn't mention all columns here 
WHERE B.id IS NULL 
LIMIT 1 

Tôi có thể bắt chước mẫu này và có vẻ như hoạt động, nhưng tôi nhầm lẫn với những gì đang diễn ra đằng sau hậu trường. Bất cứ ai có thể làm sáng tỏ cách thức này thực sự hoạt động? Tôi đang sử dụng PostgreSQL.

Trả lời

3

Bạn có chắc chắn đó là cập nhật chỉ sử dụng đoạn mã đó?

Điều thú vị là bạn đang làm trái tham gia với tên_bảng (bảng để chèn bản ghi mới) và chỉ lọc cho các hàng không tồn tại trong bảng đó. (WHERE B.id IS NULL)

Cũng giống như làm "không tồn tại", chỉ theo một cách khác.

Tôi hy vọng câu trả lời của tôi có thể giúp bạn.

Trân trọng.

+0

ah vì vậy điều này sẽ không thực sự cập nhật một mục nhập đã tồn tại? nó chỉ đảm bảo các hàng trùng lặp không được tạo ra? – Claudiu

+0

Yup, mệnh đề where chỉ là để đảm bảo rằng không có sự trùng lặp. –

+0

là ở đây bất kỳ sự khác biệt để làm điều này so với một cái gì đó như: 'INSERT INTO table_name (col1, col2, col3) SELECT% s,% s,% s KHÔNG tồn tại (SELECT * FROM table_name như T WHERE T.col1 =% s AND T.col2 =% s) '? – Claudiu

1

LEFT JOIN/IS NULL có nghĩa là truy vấn INSERTing các bản ghi chưa tồn tại. Đó là giả định bảng được xác định trên mệnh đề INSERT là giống như một trong mệnh đề trái JOIN - cẩn thận về trừu tượng hóa ...

tôi quan tâm để biết %s là những gì

+0

Tôi nghi ngờ đây là chuỗi định dạng cho hàm 'giống như sprintf()' và '% s' sẽ được thay thế bằng một số loại tên hoặc giá trị trước khi SQL được gửi đến DBMS. –

+0

yep,% s là dữ liệu (bạn có thể giả sử đó là "foo", "bar", "baz" cho ví dụ này) để được đưa vào bảng. – Claudiu

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