2012-06-21 45 views
23

Tôi có bảng URL. Chúng chứaPostgresql, cập nhật nếu hàng có một số giá trị duy nhất tồn tại, hãy chèn

(id int khóa chính, ký tự url thay đổi duy nhất, nội dung nhân vật khác nhau, ngày phân tích cuối cùng).

Tôi muốn tạo trình kích hoạt hoặc thứ gì đó (quy tắc có thể), vì vậy mỗi lần tôi chèn từ chương trình java của mình, nó cập nhật một số hàng nếu hàng có URL đó tồn tại. Khác nó nên thực hiện một Insert.

Vui lòng, bạn có thể cung cấp mã hoàn chỉnh trong Postgresql không. Cảm ơn.

+1

thể trùng lặp của [! PostgreSQL INSERT nếu tên hàng cụ thể không tồn tại] (http://stackoverflow.com/questions/5297045/postgresql- insert-if-specific-row-name-dont-exist) –

+0

Đây là cả hai câu hỏi crap. –

Trả lời

45

Điều này đã được hỏi nhiều lần. Có thể tìm thấy giải pháp có thể có tại đây: https://stackoverflow.com/a/6527838/552671

Giải pháp này yêu cầu cả hai UPDATEINSERT.

UPDATE table SET field='C', field2='Z' WHERE id=3; 
INSERT INTO table (id, field, field2) 
     SELECT 3, 'C', 'Z' 
     WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3); 

Với Postgres 9.1 chúng ta có thể làm điều đó với một truy vấn: https://stackoverflow.com/a/8702291/552671

2

Nếu INSERTS là rất hiếm, tôi sẽ tránh làm một NOT EXISTS (...) vì nó phát ra một SELECT trên tất cả các bản cập nhật. Thay vào đó, hãy xem câu trả lời wildpeaks: https://dba.stackexchange.com/questions/5815/how-can-i-insert-if-key-not-exist-with-postgresql

CREATE OR REPLACE FUNCTION upsert_tableName(arg1 type, arg2 type) RETURNS VOID AS $$ 
    DECLARE 
    BEGIN 
     UPDATE tableName SET col1 = value WHERE colX = arg1 and colY = arg2; 
     IF NOT FOUND THEN 
     INSERT INTO tableName values (value, arg1, arg2); 
     END IF; 
    END; 
    $$ LANGUAGE 'plpgsql'; 

Bằng cách này Postgres ban đầu sẽ cố gắng để làm một UPDATE. Nếu không có hàng nào bị ảnh hưởng, nó sẽ rơi trở lại để phát ra một số INSERT.

1

tôi thấy this post phù hợp hơn trong trường hợp này:

WITH upsert AS (
    UPDATE spider_count SET tally=tally+1 
    WHERE date='today' AND spider='Googlebot' 
    RETURNING * 
) 
INSERT INTO spider_count (spider, tally) 
SELECT 'Googlebot', 1 
WHERE NOT EXISTS (SELECT * FROM upsert) 
Các vấn đề liên quan