插入前检查记录是否存在

时间:2009-12-15 20:01:17

标签: php postgresql

我有一个php脚本将新部件插入postgres数据库。我想在创建之前检查零件是否存在。我怎样才能做到这一点。我正在使用通常的INSERT INTO子句。

3 个答案:

答案 0 :(得分:6)

SELECT首先要知道您是否必须INSERTUPDATE,例如:

if (
    $db->fetchOne(
        'SELECT COUNT(1) FROM parts WHERE article_number = ?',
        $p->article_number
    )
) {
    $db->update(
        'parts',
        $p->to_array(),
        $db->quoteInto('article_number = ?', $p->article_number)
    );
}
else {
    $db->insert('parts', $p->to_array());
}

Re Milen的评论:好点!使用默认的PostgreSQL事务隔离级别(READ COMMITTED),另一个进程可能会在SELECT之后,INSERT之前插入(并提交)“您的”部分。

对于我们构建的应用程序类型,我们通常只捕获数据库异常,并对其执行某些操作(通知用户,重试)。或者您可以使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。请参阅Transaction Isolation

答案 1 :(得分:5)

insert into parts(article_number,category) 
select 'KEYB','COMPTR' 
where not exists(select * from parts where article_number = 'KEYB')

答案 2 :(得分:2)

如果您很少发生冲突:采用乐观方法,只需插入新方法并处理唯一性违规(如果发生)。当它失败时,这将使当前事务无效,因此如果你正在做很多工作,那么首先检查是值得的。在这种情况下,我更喜欢SELECT EXISTS(SELECT 1 ... FROM ... WHERE ...)

无论如何,必须处理违反唯一性的可能性。即使您先检查,并发事务也有可能插入相同的记录并首先提交。