【问题标题】:DBD::SQLite: Insert or Update - QuestionDBD::SQLite:插入或更新 - 问题
【发布时间】:2011-05-11 07:01:58
【问题描述】:

在写我的问题时(如何:插入一个新条目,如果它已经存在,请更新它)我在Related Questions找到了一些答案:

$sql = "INSERT OR REPLACE INTO $table ( Id, Name, Rating ) VALUES( ?, ?, ? )";
$sth_rating = $dbh->prepare( $sql );
$sth_rating->execute( $id, $name, $rating );

.

$sql = "INSERT OR IGNORE INTO $table ( Id, Name, Rating ) VALUES ( ?, ?, ? )";
$sth_rating = $dbh->prepare( $sql );
$sth_rating->execute( $id, $name, $rating );

$sql = "UPDATE $table SET Rating = ? WHERE Id = ?";
$sth_rating = $dbh->prepare( $sql );
$sth_rating->execute( $rating, $id );

第二种方法比第一种更安全吗?

【问题讨论】:

  • 您是要完全替换现有字段还是仅更新其评级(如果存在)? en.wikipedia.org/wiki/Upsert
  • 除“Rating”之外的所有字段都来自另一个表,并且始终相同(对于该 ID)。通常会添加条目,但如果它们已经存在,则应调整可能的新“评级”值。

标签: perl sqlite dbi sql-update sql-insert


【解决方案1】:

第二种方法是 less 安全的,因为它是非原子的。换句话说,它发生在不止一个步骤中。考虑两个进程都更新相同的数据。时间在流逝。

Process 1                      Process 2

INSERT OR IGNORE...
                               INSERT OR IGNORE...
                               UPDATE...
UPDATE...

进程 1 首先启动,但进程 2 潜入并在其间进行更新。然后进程 1 直接忽略了进程 2 的更新。

在这种特殊情况下这还不错,无论如何这两个过程都会相互影响,但是通过扩展技术很容易让自己陷入困境。

(除非我误解了这个问题,而你想要的是upsert

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多