我有一個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