有没有办法使行匹配? (除了受影响的行)

时间:2019-01-22 10:29:35

标签: mysql mariadb

在存储例程中运行更新查询之后:

Update table1 set value='a' where id=1

如果该表已经具有相同的行(id = 1和value ='a'),我将收到以下消息:

  

受影响的0行,匹配的行:1已更改:0警告:0

当我检查ROW_COUNT()时,它返回0,因为它返回了受影响的行。 因此,是否有一种方法可以使用与ROW_COUNT()类似的方式(或其他任何脚本方式)来知道是否存在匹配的行?

3 个答案:

答案 0 :(得分:1)

ROW_COUNT()默认情况下获取受影响的行数。但是您可以通过帮助mysql_real_connect()来更改此行为。如果将其设置为CLIENT_FOUND_ROWS,则可以获得已创建的行数。

答案 1 :(得分:1)

您可以直接使用mysql_sysinfo()访问相同的操作摘要。

另一种解决方案是在表中添加一列,当您运行语句时,该列将始终更新。因此,即使value列不变,您的行也总是会受到影响,因为其他列也会改变。

它可能是一个时间戳列,您将更新为NOW(),例如:

update table1 set value = 'a', my_timestamp = NOW() where id=1;

或者是您自动递增的整数列:

update table1 set value = 'a', my_revision = my_revision + 1 where id=1;

答案 2 :(得分:0)

这样看-两个SQL语句几乎总是比一个慢。

让我们剖析IODKU:

  1. 深入所有UNIQUE BTree(包括PK)以查看记录是否存在。
  2. 要么...
    2a。如果存在,则更新找到的记录。
    2b。如果不存在,请插入新记录。请注意,唯一的BTree已准备好并且可以接受新条目,并且INSERT不需要检查。

对:

选择计数(*):

  1. 向下钻一些UNIQUE BTree查找行。
  2. 检查要应用多少行。

存在(选择1 ...)

  1. 向下钻一些UNIQUE BTree查找行。
  2. 返回true或false。

插入

  1. 深入所有UNIQUE BTree(包括PK)以查看记录是否存在。 (听起来很熟悉?)
  2. 要么...
    2a。如果存在,则发出重复的密钥错误
    2b。 Performa插入。 (听起来很熟悉?)

更新

  1. 根据WHERE子句查找记录-可能与上述BTree向下钻取相同。
  2. 修改行。

注意IODKU的情况

  • 避免重复工作
  • 避免使用第二(昂贵的)SQL。

顺便说一句,REPLACE是一个可怜的亲戚:

  1. 使用相同的唯一键删除所有行
  2. 使用相同的主键删除所有行。
  3. 插入(可能放回相同的键!)