我有一个php脚本可以将新部件插入到postgres数据库中。我想在创建零件之前检查零件是否存在。我怎样才能做到这一点。我正在使用通常的INSERT INTO子句。插入前检查是否存在记录
3
A
回答
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());
}
重新米伦的评论:大一点!使用默认的PostgreSQL事务隔离级别(READ COMMITTED
),另一个进程可能会在您的SELECT
之后但在您的INSERT
之前插入(并提交)“您的”部分。
对于我们构建的应用程序,我们通常只捕获数据库异常,并对其进行处理(通知用户重试)。或者你可以用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
去。见Transaction Isolation。
1
如果您很少会遇到冲突:采取乐观的方法,只需插入新的方法,并在发生时处理唯一性违规。当它失败时,这会使当前事务失效,所以如果你在其中做了很多工作,首先检查是值得的。在这种情况下,我更喜欢SELECT EXISTS(SELECT 1 ... FROM ... WHERE ...)
。
无论如何,你必须处理违反唯一性的可能性。即使您先检查,也有可能并发事务插入相同的记录并首先提交。
5
insert into parts(article_number,category)
select 'KEYB','COMPTR'
where not exists(select * from parts where article_number = 'KEYB')
+0
伟大的解决方案,如果我们想默默地忽略重复。不受竞赛状况的影响。我自己使用它。 – filiprem 2009-12-16 22:46:53
相关问题
- 1. MySQL程序检查插入之前是否存在记录
- 2. 在插入新记录之前检查记录的存在
- 3. 在插入.NET之前检查记录是否存在的最有效方法
- 4. 在插入前检查现有记录
- 5. 如何检查记录是否存在并使用MYSQL插入?
- 6. 如何检查是否存在记录,如果不插入
- 7. PHP/MySQL的 - 检查插入新记录之前,是否有重复记录
- 8. 检查是否存储过程插入记录
- 9. 插入多个记录并检查一行是否有记录
- 10. 检查在保存父记录之前是否存在匹配的子记录
- 11. 检查保存前是否存在记录
- 12. 如何在MVC中插入记录之前检查数据库中是否存在任何特定记录?
- 13. 在插入新记录之前检查现有记录的表
- 14. 实体框架:在插入新记录之前检查记录的存在
- 15. 检查表中是否存在记录
- 16. 如何检查记录是否存在
- 17. 检查记录是否存在外键
- 18. php mysql检查是否存在记录
- 19. Cakephp检查是否存在记录
- 20. 检查记录是否存在SQL PhoneGap
- 21. 检查是否存在记录
- 22. rethinkdb检查是否存在记录
- 23. 检查Dapper是否存在记录ORM
- 24. 在插入记录之前,类是否必须存在?
- 25. 插入存储过程之前检查是否存在
- 26. SSIS包检查是否存在记录然后更新否则插入
- 27. PYTHON/MySQL:检查是否存在记录。如果存在不要插入,如果不存在,则插入
- 28. 检查是否存在记录,如果是“更新”,如果没有“插入”
- 29. 回报率 - 检查是否存在记录之前建立
- 30. 查找在插入之前HIVE表中是否已存在记录
好的,做一个SELECT else子句。我是这个新手,你可以帮我看看代码吗?我可以做SELECT而不是其他位。非常感谢你的伟大思想。 – 2009-12-15 20:11:38
我已经添加了代码Russel。 $ db是Zend_Db_Adapter http://framework.zend.com/manual/en/zend.db.html#zend.db.adapter – 2009-12-15 20:17:20
当检查存在之前和之前插入具有相同article_number的记录时会发生什么插入(又名比赛条件)? – 2009-12-15 21:38:32