首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定在使用重复键时是UPDATE还是INSERT

确定在使用重复键时是UPDATE还是INSERT
EN

Stack Overflow用户
提问于 2016-07-02 18:43:02
回答 3查看 2.3K关注 0票数 4

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

代码语言:javascript
复制
$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?

EN

回答 3

Stack Overflow用户

发布于 2016-07-02 18:48:28

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

对于INSERT ... ON DUPLICATE KEY UPDATE语句,如果该行作为新行插入,则每行的

-rows值为1;如果更新了现有行,则为2;如果将现有行设置为其当前值,则为0。

票数 13
EN

Stack Overflow用户

发布于 2016-07-02 18:55:53

我自己解决了这个问题:

代码语言:javascript
复制
$flag = $statement->insert_id;

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

票数 3
EN

Stack Overflow用户

发布于 2016-07-02 18:53:53

INSERT和UPDATE之间的区别是唯一键。你可以定义很多你想要的唯一键。如果一个键有重复项,它将转到更新。

如果你有一个“普通”的INSERT INSERT“,它会给你一个重复键错误的错误。

这里有一个示例

对表执行操作

代码语言:javascript
复制
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)

插入一行

代码语言:javascript
复制
MariaDB [yourschema]> insert into dup (id,a) VALUES(1,5);
Query OK, 1 row affected (0.04 sec)

**见表**

代码语言:javascript
复制
MariaDB [yourschema]> select * from dup;
+----+------+
| id | a    |
+----+------+
|  1 |    5 |
+----+------+
1 row in set (0.01 sec)

再次插入相同内容=错误

代码语言:javascript
复制
MariaDB [yourschema]> insert into dup (id,a) VALUES(1,5);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
MariaDB [yourschema]>

带有重复键插入

代码语言:javascript
复制
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

代码语言:javascript
复制
MariaDB [yourschema]> select * from dup;
+----+------+
| id | a    |
+----+------+
|  1 |   10 |
+----+------+
1 row in set (0.01 sec)

MariaDB [yourschema]>

使用

INSERT INTO ....的正确用法在重复键上是:

代码语言:javascript
复制
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进行准备,也可以插入更多行

代码语言:javascript
复制
INSERT INTO table (unique_key, column_1, column_2) 
VALUES (?,?,?),(?,?,?)
ON DUPLICATE KEY UPDATE
value_1 = VALUES(column_1), value_2 = VALUES(column_2)";
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38159224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档