2014-10-28 88 views
2

我需要插入到表中或更新值。PDO插入,得到“更新”或“插入”作为回报

我需要知道数据是更新还是新创建。

目前我的逻辑是SELECT,如果不存在INSERT,如果存在UPDATE

我需要对更新的行和插入的行进行计数。

这很慢,我需要一个更快的方法:我可以使用INSERTREPLACE而不尝试先选择,并让PDO客户端返回该行是否已更新或插入?

我使用PHP/PDO/MySQL的

更新与伪代码:

当前逻辑:

<?php 
$rowExists = PDO SELECT by key 

if ($rowExists) 
    PDO UPDATE by key 
    $updates++ 
else 
    PDO INSERT 
    $inserts++ 

通缉逻辑:

<?php 
PDO INSERT .. ON DUPLICATE KEY 
$updates++ or $inserts++ according to what it actually did 
+0

有'insert ... on duplicate key update' – 2014-10-28 21:34:51

+0

@MarcB我知道,但它告诉我它是否已更新或插入?请使用伪代码查看我更新的问题。 – DanFromGermany 2014-10-28 21:39:49

+1

如果它被插入,则last_insert_id()将具有该新行的新ID。但是这仅适用于单插入。如果您使用扩展插入语法,或者“insert ... select from”,那么所有投注都将关闭。 – 2014-10-28 21:40:50

回答

0

你可以如果使用,则切一步(SELECT)。所以它只会是一个查询。

下面是文档:

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

至于检查,这里是代码:

if($stmt->rowCount() > 0){ 
    if($stmt->lastInsertId() != 0){ 
     echo 'Row was inserted'; 
    }else{ 
     echo 'Row was updated'; 
    } 
}else{ 
    echo 'row was neither updated or inserted'; 
} 
+0

我怎么知道它实际上插入或更新? – DanFromGermany 2014-10-28 21:35:55

+0

@DanFromGermany检查'$ stmt-> lastInsertId()'是否插入了0,例如'($ stmt-> lastInsertId()> 0)? 'inserted':'updated'' – meda 2014-10-28 21:36:47

+0

@DanFromGermany看到我的更新 – meda 2014-10-28 21:42:11

0

REPLACE INTO是,如果你有一个主键或唯一索引,你需要什么你的桌子。

0

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html会这样做,如果你的表有一个主键或唯一索引。

假设你有一个带有列id(主键),a和b的表格,并且你有一个记录(1,2,3)。您有id = 1的新值,即a = 4和b = 5,但您不想检查id = 1是否已有条目。

 

    INSERT 
    (id, a, b) 
    VALUES 
    (1, 4, 5) 
    ON DUPLICATE KEY UPDATE 
    a = VALUES(a), 
    b = VALUES(b); 

将自找到主键以来更新。