如何选择受更新影响的行

enh*_*nic 7 mysql

执行update查询时(以下只是示例;update可以使用任何查询)例如:

update t1 
inner join t2 on t1.id=t2.id
set t1.name="foo" where t2.name="bar";
Query OK, 324 rows affected (1.82 sec)
Run Code Online (Sandbox Code Playgroud)

您如何查看哪些行受到影响(324 rows affected响应中的)?我尝试将表达式转换为 a select,例如

select * from t1 
inner join t2 on t1.id=t2.id
where t1.name="foo";
Run Code Online (Sandbox Code Playgroud)

但这也会返回 之前的name="foo"update。从概念上讲,我想做类似的事情

select * from rows_affected;
Run Code Online (Sandbox Code Playgroud)

但这当然行不通。是否有一种方法可以允许检查/选择受查询影响的行updateselect 或者是在之前执行此操作update以查看哪些行将受到影响的唯一解决方案?

nbk*_*nbk 0

许多行可以有 t1.name="foo"。

如果MySQL检测到您已经拥有尝试输入的值,则它不会更新该行

但只有链接到条件 t2.name="bar" 的连接 t1 行才会显示在以下查询中

select t1.id from t1 
inner join t2 on t1.id=t2.id
where t2.name="bar";
Run Code Online (Sandbox Code Playgroud)

当然,如果 t1.name 已经具有值“foo”,它不会检测到,因此它会显示不受影响的t1.ids 。

如果您需要实际的行,而不需要未关联的行,则必须编写一个搅拌过程,其中您可以

  1. 选择 t1.name 已为“foo”的 ids
  2. 更新你的表
  3. 执行上述查询并删除 1 中的所有 id。

举个例子

CREATE TABLE t1 (id int auto_increment primary key,name varchar(4));
INSERT INTO t1(name) VALUES('foo'),('foo1'), ('foo'), ('test'), ('test'), ('test'), ('test'), ('test'), ('test'), ('test');
 CREATE TABLE t2 (id int auto_increment primary key,name varchar(4));
INSERT INTO t2(name) VALUES('bar'),('foo1'), ('bar'), ('bar'), ('bar'), ('test'), ('bar'), ('test'), ('test'), ('test');
 
Run Code Online (Sandbox Code Playgroud)
SELECT * FROm t1;
Run Code Online (Sandbox Code Playgroud)
编号 | 姓名
-: | :---
 1 | 富
 2 | 富1
 3 | 富
 4 | 测试
 5 | 测试
 6 | 测试
 7 | 测试
 8 | 测试
 9 | 测试
10 | 10 测试
SELECT * FROM t2;
Run Code Online (Sandbox Code Playgroud)
编号 | 姓名
-: | :---
 1 | 酒吧
 2 | 富1
 3 | 酒吧
 4 | 酒吧
 5 | 酒吧
 6 | 测试
 7 | 酒吧
 8 | 测试
 9 | 测试
10 | 10 测试
CREATE TEMPORARY table t1_temp SELECT id FROM t1 WHERE name = 'foo';
Run Code Online (Sandbox Code Playgroud)
update t1 
inner join t2 on t1.id=t2.id
set t1.name="foo" where t2.name="bar";
Run Code Online (Sandbox Code Playgroud)
SELECT * FROM t1;
Run Code Online (Sandbox Code Playgroud)
编号 | 姓名
-: | :---
 1 | 富
 2 | 富1
 3 | 富
 4 | 富
 5 | 富
 6 | 测试
 7 | 富
 8 | 测试
 9 | 测试
10 | 10 测试
select t1.id from t1 
inner join t2 on t1.id=t2.id
where t2.name="bar" AND t1.id NOT IN (SELECT id FROM t1_temp);
Run Code Online (Sandbox Code Playgroud)
| 编号 |
| -: |
| 4 |
| 5 |
| 7 |

db<>在这里摆弄