Php 确定在重复密钥上使用时是否更新或插入

Php 确定在重复密钥上使用时是否更新或插入,php,mysql,mysqli,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,

我使用的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();
}
如何判断查询执行的是更新还是插入?

您可以使用并检查返回值。发件人:

对于
插入。。。在重复的键更新
语句中,受影响的行 如果行作为新行插入,则每行的值为1,如果为 现有行将被更新,如果现有行设置为当前行,则为0 当前值


插入和更新之间的区别是一个唯一的键。您可以定义所需的多个唯一密钥。如果一个键有重复项,则转到更新

如果你有一个“正常”插入到“它给你一个错误的重复键错误的重复工程

这是样品

表格

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]>
使用重复键插入

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 table (unique_key, column_1, column_2) 
VALUES (?,?,?)
ON DUPLICATE KEY UPDATE
value_1 = VALUES(column_1), value_2 = VALUES(column_2)";
您只使用3 arg进行prepare,还可以插入更多行

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

我自己解决了这个问题:

$flag = $statement->insert_id;

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

在重复键更新列_1=?,列_2=?”上更改此选项;这是一个很好的观点,但没有回答问题。@revo-我的回答中有一个样本,但它没有回答问题!写了这么多,读了这么多,却发现它与问题完全相关:/这会在更新和插入时返回id。仅当更新时未更改任何内容时,它才会返回0。