Php PostgreSQL-此升级是否有效?

Php PostgreSQL-此升级是否有效?,php,sql,postgresql,Php,Sql,Postgresql,好的,我刚开始使用pgSQL,当然发现在重复键上没有类似MySQL的。用PHP开发 我想听听你对这个解决方案的意见,不管是好的还是坏的,如果有错误的话 所以我有一个对象(在PHP中)已经填充了数据。若在编辑时进行了填充,则对象的ID也将存在,否则ID将为0。当涉及到保存时,首先我检查该ID,如果它大于0,则可以,否则,我将从我的数据库中获取一个新ID,使用以下命令: $query = "SELECT NEXTVAL(PG_GET_SERIAL_SEQUENCE(?, ?)) id"; 正如我最

好的,我刚开始使用pgSQL,当然发现在重复键上没有类似MySQL的
。用PHP开发

我想听听你对这个解决方案的意见,不管是好的还是坏的,如果有错误的话

所以我有一个对象(在PHP中)已经填充了数据。若在编辑时进行了填充,则对象的ID也将存在,否则ID将为0。当涉及到保存时,首先我检查该ID,如果它大于0,则可以,否则,我将从我的数据库中获取一个新ID,使用以下命令:

$query = "SELECT NEXTVAL(PG_GET_SERIAL_SEQUENCE(?, ?)) id";
正如我最近了解到的,可以保证ID是唯一的,这通常是很重要的(@IMSoP)

接下来是实际的upsert,我发现的最简单的方法是这个(@Craig Ringer也评论说它有并发问题)

这就是普里蒂


我很想听听您的意见:)

据我所知,您可以在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);

伊克斯,我在哪里写的,多久以前?它需要一个巨大的“非并发安全,除非锁定表”免责声明。(编辑)啊,你在说什么。我并没有写那个,我只是在底部添加了警告。所以,若对象有id,你们就做一个对象,否则你们就从表中提取序列号并插入?为什么不更新那些有身份证的人,然后根据序列插入其余的人,然后在自己身上插入身份证呢?可能是@Craig Ringer的复制品:很抱歉,你写了这个,我编辑了原始帖子。。。顺便说一句,只是一个问题,当我有一个单独的查询来获取新ID时,为什么它是“非并发安全的”?这难道不能确保没有并发问题吗?AFAIK NEXTVAL确保每次都提供新的ID,不是吗?@Adrian你是对的,如果你知道你在做一个插入并获得一个新的ID,那么插入是安全的,但它也是毫无意义和效率低下的。你的应用程序知道它可以发出
插入
更新
,如果它知道是否正在创建记录,它不需要跳转到upsert。如果存在并发插入,这仍然是不安全的,除非你锁定表。谢谢@CraigRinger,我知道,锁定机制与mysql有点不同。这应该不是问题。依我拙见
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);