PostgreSQL - 这个upsert有效吗?

时间:2013-08-15 08:52:31

标签: php sql postgresql

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

我想听听你对这个解决方案的看法,包括upsert,好的和坏的事情以及可能的错误(如果有的话)。

所以我有一个填充了数据的对象(在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);

这很安全。

我很想听听你的意见:)

1 个答案:

答案 0 :(得分: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);
相关问题