3

postgres で sqlite で以下と同等のことを行う簡単な方法はありますか?

INSERT INTO foo (x, y, z) VALUES (1, 2, 3) ON CONFLICT replace;

私は周りを見回しましたが、私が見つけた解決策は複雑なカスタム関数です。私の問題に対する他の解決策は、単に行うことです

delete from foo where x=1; INSERT INTO foo (x, y, z) VALUES (1, 2, 3) ON CONFLICT replace;

これは意味的に同等ではありませんが、私の場合は機能します。

ON CONFLICTカスタム関数を必要としない場合は、ルールを好むだけです。

4

2 に答える 2

4

PostgreSQL バージョン 9.1 (現時点ではベータ版) の時点で、共通テーブル式を使用して挿入または置換を行うことができます。

/**
CREATE TABLE foo(id serial primary key, content text unique);
**/

WITH replace AS (
    DELETE FROM foo
    WHERE
        content = 'bar'
    RETURNING content
)
INSERT INTO 
    foo(content) -- values:
SELECT
    *
FROM replace RIGHT JOIN (SELECT CAST('bar' AS text) as content) sub USING(content);

「bar」は、挿入または置換される値です。

古いバージョンでは動作しません。お待ちください :-(

于 2011-05-04T08:46:24.770 に答える
2

バージョン 9.5 以降、PostgreSQL は「UPSERT」機能を提供します。

http://www.postgresql.org/docs/current/static/sql-insert.html

コマンドの ON CONFLICT 部分に注意してください。

于 2016-01-15T16:05:45.300 に答える