Tôi đang cập nhật cơ sở dữ liệu Postgres 8.4 (từ mã C#) và nhiệm vụ cơ bản là đủ đơn giản: hoặc UPDATE một hàng hiện có hoặc INSERT một hàng mới nếu một doesn ' chưa tồn tại. Thông thường tôi sẽ làm điều này:Postgres UPSERT (INSERT hoặc UPDATE) chỉ khi giá trị khác nhau
UPDATE my_table
SET value1 = :newvalue1, ..., updated_time = now(), updated_username = 'evgeny'
WHERE criteria1 = :criteria1 AND criteria2 = :criteria2
và nếu 0 hàng bị ảnh hưởng sau đó làm một INSERT:
INSERT INTO my_table(criteria1, criteria2, value1, ...)
VALUES (:criteria1, :criteria2, :newvalue1, ...)
Có một xoắn nhẹ, mặc dù. Tôi không muốn thay đổi các cột updated_time và updated_username trừ khi bất kỳ giá trị mới nào khác với giá trị hiện tại để tránh gây hiểu lầm cho người dùng về thời điểm dữ liệu được cập nhật.
Nếu tôi chỉ làm một UPDATE thì tôi có thể thêm điều kiện WHERE cho các giá trị, nhưng điều đó sẽ không hoạt động ở đây, bởi vì nếu DB đã được cập nhật thì UPDATE sẽ ảnh hưởng đến 0 hàng và sau đó tôi sẽ cố gắng INSERT.
Có ai có thể nghĩ ra một cách thanh lịch để làm điều này, ngoài SELECT, sau đó là UPDATE hoặc INSERT?
bản sao có thể có của [Chèn, cập nhật trùng lặp (postgresql)] (http://stackoverflow.com/questions/1109061/insert-on-duplicate-update-postgresql) –
Không, không trùng lặp. Câu trả lời ở đó về cơ bản chỉ đóng gói trong một hàm tôi đã viết ở trên. – EMP