我有一个php脚本将新部件插入postgres数据库。我想在创建之前检查零件是否存在。我怎样才能做到这一点。我正在使用通常的INSERT INTO子句。
答案 0 :(得分:6)
您SELECT
首先要知道您是否必须INSERT
或UPDATE
,例如:
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 ...)
。
无论如何,必须处理违反唯一性的可能性。即使您先检查,并发事务也有可能插入相同的记录并首先提交。