0

さて、私は pgSQL を始めたばかりですが、もちろん、ON DUPLICATE KEYMySQL のようなものがないことを発見しました。PHPで開発中。

アップサート、良いことと悪いこと、そしてエラーがある場合は、このソリューションについての意見をお聞きしたいと思います。

だから私はデータが取り込まれた(PHPの)オブジェクトを持っています。編集時に移入が行われた場合、オブジェクトの ID もそこにあり、それ以外の場合は ID が 0 になります。保存に関しては、最初にその ID を確認し、それが > 0 の場合は問題ありません。それ以外の場合は、から新しい ID を取得しています私のDB、これを使用:

$query = "SELECT NEXTVAL(PG_GET_SERIAL_SEQUENCE(?, ?)) id";

最近知ったように、ID が一意であるという保証があり、これは通常重要なことです (@IMSoP)。

次は実際の upsert です。私が見つけた最も簡単な方法はこれでした (@Craig Ringer も同時実行の問題があるとコメントしています)。

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);

そして、それだけです。

私はあなたの意見を聞きたいです:)

4

1 に答える 1

1

私の知る限り、PostgreSQL では次のようなことができます。

with cte as (
    update table1 set
       field='C', field2='Z'
    where id=3
    returning *
)
insert into table1 (id, field, field2)
select 3, 'C', 'Z'
where not exists (select * from cte);
于 2013-08-15T09:03:47.207 に答える