簡體   English   中英

插入前檢查是否存在記錄

[英]Check is record exists before inserting

我有一個PHP腳本將新部件插入postgres數據庫。 我想在創建之前檢查零件是否存在。 我怎樣才能做到這一點。 我使用通常的INSERT INTO子句。

首先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 請參閱事務隔離

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

如果您很少發生沖突:采用樂觀方法,只需插入新方法並處理唯一性違規(如果發生)。 當它失敗時,這將使當前事務無效,因此如果你正在做很多工作,那么首先檢查是值得的。 在這種情況下,我更喜歡SELECT EXISTS(SELECT 1 ... FROM ... WHERE ...)

無論如何,您必須處理違反唯一性的可能性。 即使您先檢查,並發事務也有可能插入相同的記錄並首先提交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM