MYSQL 更新查询在不同情况下给出相同的响应
"0 行受到影响。(查询耗时 0.0789 秒)"
1) 条款不匹配的情况
2) 其中子句匹配但给定值与现有值相同
前任:
假设表中不存在 user_id
= '86'
UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86'
假设 user_id
= '86' 存在。但是价值"Efac"已经在那里了
UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86'
问题是,有什么更好的方法来显着识别这两种情况?
我正在使用:MYSQL :
+-------------------------+
| @@version |
+-------------------------+
| 5.6.19-0ubuntu0.14.04.1 |
+-------------------------+
菲律宾比索 : 5.5.9-1 (PDO)
MySQL 命令行
如果您使用的是MySQL命令行工具,则给出的输出将允许您区分这两种情况。
如果该条目不存在:
+---------------+---------+
| user_id | faculty |
+---------------+---------+
| 80 | abc |
+---------------+---------+
mysql> UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
如果条目确实存在,但未更新:
+---------------+---------+
| user_id | faculty |
+---------------+---------+
| 80 | abc |
| 86 | Efac |
+---------------+---------+
mysql> UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
如果该条目确实存在并已更新:
+---------------+---------+
| user_id | faculty |
+---------------+---------+
| 80 | abc |
| 86 | bcd |
+---------------+---------+
mysql> UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
菲律宾比索 - PDO
不幸的是,PDO没有提供一种机制来匹配查询的行和更改行,但您可以选择所需的行。默认值是返回更改的行数,但可以在连接时指定该选项以返回匹配的行数:
$db = new PDO('mysql:dbname=database;host=host', 'username', 'password', array(
PDO::MYSQL_ATTR_FOUND_ROWS => true
));
PHP - MySQLi
MySQLi 函数在匹配和更新之间进行选择方面可以执行与 PDO 相同的操作:
$db = mysqli_init();
$db->real_connect('host', 'username', 'password', 'database', '3306', null, MYSQLI_CLIENT_FOUND_ROWS);
但是您也可以调用函数mysqli_info()
/$db->info()
(请参阅 http://php.net/manual/en/mysqli.info.php),它将返回一个字符串,其中包含匹配/更新的行,然后您可以解析该字符串:
Records: 3 Duplicates: 0 Warnings: 0
使用C MySQL API(或其包装器)。来自 MySQL 文档:
UPDATE 返回实际更改的行数。这mysql_info() C API 函数返回匹配和更新以及期间发生的警告数更新。
点击mysql_info显示:
更新
字符串格式:匹配的行数:40 更改:40 警告:0
这看起来像是你可以解析的东西:)
编辑BK435说不清楚我是否回答了OP的问题。我想我做到了:您无法仅从返回的受影响行中获取该信息(很明显,因为0==0
,但您需要使用 mysql_info
.