Php 插入前检查记录是否存在
我有一个php脚本,可以将新部件插入postgres数据库。我想在创建零件之前检查零件是否存在。我怎样才能做到这一点。我使用的是通常的INSERT INTO子句。您首先选择,以了解是否必须插入或更新,如: Re Milen的评论:太棒了!使用默认的PostgreSQL事务隔离级别READ COMMITTED,可能会有另一个进程在您的选择之后但在您的插入之前插入并提交您的部件Php 插入前检查记录是否存在,php,postgresql,Php,Postgresql,我有一个php脚本,可以将新部件插入postgres数据库。我想在创建零件之前检查零件是否存在。我怎样才能做到这一点。我使用的是通常的INSERT INTO子句。您首先选择,以了解是否必须插入或更新,如: Re Milen的评论:太棒了!使用默认的PostgreSQL事务隔离级别READ COMMITTED,可能会有另一个进程在您的选择之后但在您的插入之前插入并提交您的部件 对于我们构建的应用程序类型,我们通常只捕获DB异常,并对其采取措施通知用户,然后重试。或者您可以使用设置事务隔离级别SER
对于我们构建的应用程序类型,我们通常只捕获DB异常,并对其采取措施通知用户,然后重试。或者您可以使用设置事务隔离级别SERIALIZABLE。请参阅。如果您很少期望冲突:采取乐观的方法,只需插入新的方法,并在发生唯一性冲突时处理它。当当前事务失败时,这将使其无效,因此如果您在其中做了大量工作,那么首先检查它是值得的。在这种情况下,我更喜欢选择exist选择1。。。从…起在哪里
无论如何,您必须处理唯一性冲突的可能性。即使您先检查,也有可能并发事务插入相同的记录并首先提交。Ok,执行SELECT else子句。我是这方面的新手,你能帮我看一下代码吗?我可以做选择,但不能做其他部分。非常感谢你的伟大思想。我已经添加了代码Russel$db是Zend_db_适配器当在检查存在性之后和插入a.k.a.竞争条件之前插入具有相同文章编号的记录时会发生什么情况?谢谢你的评论Milen。这绝对是值得注意的。我已经更新了我的答案。如果我们想默默地忽略重复的内容,这是一个很好的解决方案。不受种族条件的影响。我自己用。
insert into parts(article_number,category)
select 'KEYB','COMPTR'
where not exists(select * from parts where article_number = 'KEYB')
insert into parts(article_number,category)
select 'KEYB','COMPTR'
where not exists(select * from parts where article_number = 'KEYB')