【问题标题】:Determine if UPDATE or INSERT when using ON DUPLICATE KEY [duplicate]使用 ON DUPLICATE KEY [重复] 时确定是 UPDATE 还是 INSERT
【发布时间】:2016-07-02 10:43:02
【问题描述】:

我正在使用如下所示的 mysqli/php 查询:

$query = "
INSERT INTO table (unique_key, column_1, column_2) 
VALUES (?,?,?)
ON DUPLICATE KEY UPDATE
value_1 = ?, value_2 = ?";
if ($statement = $mysqli->prepare($query))
{
    $statement->bind_param("iiiii", $unique_key, $value_1, $value_2, $value_1, $value_2);
    $statement->execute();
    $statement->close();
}

如何判断查询执行的是 UPDATE 还是 INSERT?

【问题讨论】:

  • 更改此 ON DUPLICATE KEY UPDATE column_1 = ?, column_2 = ?";

标签: php mysql mysqli


【解决方案1】:

您可以使用mysqli_affected_rows 并检查返回值。来自MySQL docs

对于INSERT ... ON DUPLICATE KEY UPDATE 语句,受影响的行 如果该行作为新行插入,则每行的值为 1,如果插入新行,则为 2 现有行被更新,如果现有行被设置为它的,则为 0 当前值。

【讨论】:

    【解决方案2】:

    我自己解决了这个问题:

    $flag = $statement->insert_id;
    

    如果$flag > 0 则为插入,否则为更新。

    【讨论】:

    • 这会在更新和插入时返回 id。它只返回 0 如果更新时没有任何变化。
    【解决方案3】:

    INSERT 和 UPDATE 之间的区别是唯一键。你可以定义这么多你想要的唯一键。如果一个键有重复,它会进入 UPDATE。

    如果你有一个“正常的”INSERT INTO”,它会给你一个重复键错误的错误,ON DUPLICATE 可以工作

    这里是一个示例

    表格

    MariaDB [yourschema]> show create table dup;
    
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | dup   | CREATE TABLE `dup` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `a` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.02 sec)
    

    插入一行

    MariaDB [yourschema]> insert into dup (id,a) VALUES(1,5);
    Query OK, 1 row affected (0.04 sec)
    

    *见表格**

    MariaDB [yourschema]> select * from dup;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |    5 |
    +----+------+
    1 row in set (0.01 sec)
    

    再次插入 = 错误

    MariaDB [yourschema]> insert into dup (id,a) VALUES(1,5);
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    MariaDB [yourschema]>
    

    使用 ON DUPLICATE KEY 插入

    MariaDB [yourschema]> insert into dup (id,a) VALUES(1,5) ON DUPLICATE KEY UPDATE a=a+VALUES(a);
    Query OK, 2 rows affected (0.01 sec)
    

    再次查看表格 - 它添加了字段 a

    MariaDB [yourschema]> select * from dup;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |   10 |
    +----+------+
    1 row in set (0.01 sec)
    
    MariaDB [yourschema]>
    

    用法

    INSERT INTO .... ON DUPLICATE KEY 的正确用法是:

    INSERT INTO table (unique_key, column_1, column_2) 
    VALUES (?,?,?)
    ON DUPLICATE KEY UPDATE
    value_1 = VALUES(column_1), value_2 = VALUES(column_2)";
    

    您只使用 3 个 arg 进行准备,也可以插入更多行

    INSERT INTO table (unique_key, column_1, column_2) 
    VALUES (?,?,?),(?,?,?)
    ON DUPLICATE KEY UPDATE
    value_1 = VALUES(column_1), value_2 = VALUES(column_2)";
    

    【讨论】:

    • 这是一个很好的观点,但没有回答问题。
    • @revo - 我的答案中有一个样本
    • 但它没有回答问题!
    • 写了这么多,读了这么多,却发现都与问题无关:/
    猜你喜欢
    • 2015-07-30
    • 2010-10-07
    • 1970-01-01
    • 2013-10-03
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多