使用ON DUPLICATE KEY时确定是否UPDATE或INSERT

时间:2016-07-02 10:43:02

标签: php mysql mysqli

我正在使用看起来像这样的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?

3 个答案:

答案 0 :(得分:8)

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

  

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

答案 1 :(得分:1)

好吧,看起来我自己解决了这个问题:

$flag = $statement->insert_id;

如果$flag > 0那么它是一个插入,否则它是一个更新。

很抱歉打扰你们......

答案 2 :(得分:0)

INSERT和UPDATE之间的区别是一个独特的键。您可以定义如此多的UNIQUE KEY。如果一个密钥有重复,则转到更新。

如果你有"正常" 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 INSERT

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)

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

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

MariaDB [yourschema]>

<强> USAGE

正确使用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)";