2016-11-02 4 views
1

私はinsert文で行を更新したいと思います。実際、行を挿入することはできますが、一意の属性がすでに存在する場合は、コンテンツを更新したいと思います。競合で新しい値を更新します。

は、だから私は

CREATE TABLE dtest (
    "id" text, 
    followers_count int4, 
    someuniq int4 
); 
CREATE UNIQUE INDEX dtest_idx ON dtest USING btree (someuniq); 

CREATE TABLE temp_data (
    tid text, 
    tfo int4, 
    tuniq int4); 

のは、私は一時タブを持っていることを考えると、私は、この表

INSERT INTO temp_data VALUES ('id1',4,1); 
INSERT INTO temp_data VALUES ('id2',0,2); 
INSERT INTO temp_data VALUES ('id3',40,3); 


INSERT INTO dtest("id","followers_count","someuniq") 
SELECT t.tid, t.tfo, t.tuniq 
FROM temp_data t 
ON CONFLICT DO NOTHING; 

代わりの挿入を行うと、更新から/更新データを挿入し、これらのテーブルを得ましたこのような値で値を更新することができるかどうかを知りたい場合は

INSERT INTO dtest("id","followers_count","someuniq") 
SELECT tid, tfo, tuniq 
FROM temp_data 
ON CONFLICT ("someuniq") 
DO UPDATE SET followers_count = 
     (SELECT tfo FROM temp_data where tid = EXCLUDED.tid) 
    WHERE EXCLUDED.id = tid; 

Wic hは、「行がすでに存在する場合はいくつかのフィールドを更新する」ことを意味します。何が間違っていますか?

答えて

1

サブセレクトを使用する必要はありません。 excluded行には、followers_count

INSERT INTO dtest (id, followers_count, someuniq) 
SELECT tid, tfo, tuniq 
FROM temp_data 
ON CONFLICT (someuniq) 
DO UPDATE 
    SET followers_count = excluded.followers_count; 
を含むすべてのターゲット列が含まれます。
関連する問題