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.
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
Yup, mệnh đề where chỉ là để đảm bảo rằng không có sự trùng lặp. –
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