MYSQL 使用 PHP 更新或插入 [重复]

Posted

技术标签:

【中文标题】MYSQL 使用 PHP 更新或插入 [重复]【英文标题】:MYSQL update or insert with PHP [duplicate] 【发布时间】:2017-12-24 08:06:17 【问题描述】:

我需要更新数据库中的一条记录,但我不知道该记录是否已经存在。如果存在,更新它,否则插入它。现在我想出了这个代码:

1: <?php
2: $query = "UPDATE user_meta SET active = '0' WHERE user_id = '125'";
3: $mysqli->query($query);
4: 
5: if($mysqli->affected_rows == 0)
6:     $query = "INSERT INTO user_meta (user_id, active) VALUES ('125', 0)";
7:     $mysqli->query($query);
8: 

桌子:

CREATE TABLE `user_meta` (
  `user_id` int(11) DEFAULT NULL,
  `active` tinyint(4) DEFAULT NULL,
  UNIQUE KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这段代码对我来说运行良好,但它实际上会产生一个我忽略的错误。

问题出在5这一行。如果没有任何更改,即使记录已经存在,affected_rows 是0。但这会触发 INSERT 语句。这个失败是因为 user_id 字段是唯一的,现在我忽略了这一点,所以我的代码工作正常。

但这是要走的路吗? 还是我应该先做一个选择然后更新或插入?

【问题讨论】:

将 user_id 设为 int 而不是字符串并检查 在执行插入或更新之前,只需触发一个SELECT query to get count for this user id。如果计数为 1,则执行更新,否则执行插入。 【参考方案1】:

你可以使用INSERT ... ON DUPLICATE KEY解决这个问题

使用这种方法在事务上是安全的,因为 MySQL 在一个隐式事务中处理它。您当前的方法允许两个并发请求可能相互干扰的瞬间。

假设您使用的是 MySQL 5.7:https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

您的查询将如下所示:

INSERT INTO user_meta SET user_id = 125, active = 0
  ON DUPLICATE KEY UPDATE active = 0

更新: 只是为了详细说明为什么您当前的方法在事务上不安全,想象一下两个并发请求并行执行。

    请求 1 尝试更新,看到 0 个受影响的行。 请求 2 尝试更新,看到 0 个受影响的行。 请求 1 插入一条新记录。 请求 2 插入一条新记录。

无论你是显式启动和完成一个事务,还是你隐式做(例如通过INSERT ... ON DUPLICATE KEY)MySQL都将负责确保上述错误场景在第一个请求完成之前阻塞第二个请求不会发生。

【讨论】:

【参考方案2】:

MySQL 对此有一个内置的解决方案 - on duplicate key update 子句:

INSERT INTO user_meta (user_id, active) 
VALUES (125, 0)
ON DUPLICATE KEY UPDATE active = 0

【讨论】:

【参考方案3】:

使用 mysql ON DUPLICATE KEY UPDATE 检查数据库中是否已经存在记录。您的表必须有一个具有 unique 类型的列。在这里,您的 user_id 列是唯一类型。查看文档here

INSERT INTO user_meta (user_id, active) 
VALUES (125, 0)
ON DUPLICATE KEY UPDATE active = 0

【讨论】:

以上是关于MYSQL 使用 PHP 更新或插入 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 在 MySQL 中插入 now() 函数 [重复]

PHP将语句插入XAMPP MySQL数据库不会导致表更新[重复]

如果数据存在,则更新其他插入,使用子查询或等的mysql [重复]

如果 COUNT = 0 [重复],如何在 mySQL 中插入或更新查询

PHP MySql MsSql 如何插入或更新 ['] 或 ["] 或 [`] 字符?

创建PHP时间戳以插入mysql数据库[重复]