好的,所以我刚开始使用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);
这很安全。
我很想听听你的意见:)
答案 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);