0

好的,所以我刚开始使用 pgSQL,当然发现没有ON DUPLICATE KEY像 MySQL 那样。用 PHP 开发。

我想听听你对这个解决方案的意见,无论是好事还是坏事,如果有任何错误,也可能是错误。

所以我有一个已填充数据的对象(在 PHP 中)。如果在编辑时进行了填充,则对象的 ID 也将在那里,否则 ID 将为 0。在保存时,首先我检查该 ID,如果它 > 0 则可以,否则,我将获得一个新 ID我的数据库,使用这个:

$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 回答