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

Mysql 有没有办法让行匹配?(除了受影响的行),mysql,mariadb,Mysql,Mariadb,在存储例程中运行更新查询后: Update table1 set value='a' where id=1 如果表已经有一个相同的行(id=1,value='a'),我将得到以下消息: 0行受影响,匹配的行:1已更改:0警告:0 当我检查ROW\u COUNT()时,它返回0,因为它返回受影响的行。 那么,是否有一种方法可以使用与行计数()(或任何其他脚本方式)类似的方法来知道是否存在匹配的行?行计数()默认情况下获取受影响的行数。但是你可以在帮助下改变这种行为。如果将其设置为CLIENT\u

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

Update table1 set value='a' where id=1
如果表已经有一个相同的行(id=1,value='a'),我将得到以下消息:

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

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

行计数()
默认情况下获取受影响的行数。但是你可以在帮助下改变这种行为。如果将其设置为
CLIENT\u FOUND\u ROWS
,则可以获取已建立的行数。

ROW\u COUNT()
默认情况下获取受影响的行数。但是你可以在帮助下改变这种行为。如果将其设置为
CLIENT\u FOUND\u ROWS
,则可以获得已建立的行数。

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

另一种解决方案可能是向表中添加一列,在运行语句时始终更新该列。因此,即使
列没有更改,您的另一列也会更改,因此始终会受到行的影响

它可能是一个时间戳列,您可以将其更新为
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;

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

另一种解决方案可能是向表中添加一列,在运行语句时始终更新该列。因此,即使
列没有更改,您的另一列也会更改,因此始终会受到行的影响

它可能是一个时间戳列,您可以将其更新为
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;
这样看——两条SQL语句几乎总是比一条慢

让我们剖析一下IODKU:

  • 向下钻取所有唯一的btree(包括PK)以查看记录是否存在
  • 要么…
    2a。如果存在,请更新找到的记录。
    2b。如果不存在,请插入新记录。请注意,唯一的btree已准备就绪,可以接受新条目,插入不需要检查
  • 与:

    选择计数(*):

  • 向下钻取一些独特的B树以查找该行
  • 检查应用了多少行
  • 存在(选择1…)

  • 向下钻取一些独特的B树以查找该行
  • 返回真或假
  • 插入

  • 向下钻取所有唯一的btree(包括PK)以查看记录是否存在。(听起来很熟悉?)
  • 要么…
    2a。如果存在,则发出重复密钥错误
    2b。穿孔插入物。(听起来很熟悉?)
  • 更新

  • 根据
    WHERE
    子句查找记录——可能与上面提到的BTree向下钻取相同
  • 修改行
  • 注意IODKU

    • 避免重复工作
    • 避免(昂贵的)第二个SQL
    顺便说一句,
    REPLACE
    是一个差劲的亲戚:

  • 删除具有相同唯一键的所有行
  • 删除具有相同主键的所有行
  • 插入(可能放回相同的键!)
  • 这样看——两条SQL语句几乎总是比一条慢

    让我们剖析一下IODKU:

  • 向下钻取所有唯一的btree(包括PK)以查看记录是否存在
  • 要么…
    2a。如果存在,请更新找到的记录。
    2b。如果不存在,请插入新记录。请注意,唯一的btree已准备就绪,可以接受新条目,插入不需要检查
  • 与:

    选择计数(*):

  • 向下钻取一些独特的B树以查找该行
  • 检查应用了多少行
  • 存在(选择1…)

  • 向下钻取一些独特的B树以查找该行
  • 返回真或假
  • 插入

  • 向下钻取所有唯一的btree(包括PK)以查看记录是否存在。(听起来很熟悉?)
  • 要么…
    2a。如果存在,则发出重复密钥错误
    2b。穿孔插入物。(听起来很熟悉?)
  • 更新

  • 根据
    WHERE
    子句查找记录——可能与上面提到的BTree向下钻取相同
  • 修改行
  • 注意IODKU

    • 避免重复工作
    • 避免(昂贵的)第二个SQL
    顺便说一句,
    REPLACE
    是一个差劲的亲戚:

  • 删除具有相同唯一键的所有行
  • 删除具有相同主键的所有行
  • 插入(可能放回相同的键!)

  • 你的客户语言是什么?(PHP/C/Java/…)@RickJames我想在存储过程中使用它。您可能需要一个单独的
    从表1中选择COUNT(*),其中id=1
    ,才能获得该值。你为什么需要它?@RickJames我知道我可以,但尽量避免它,因为它会减慢执行速度。我正试图找到
    INSERT。。在重复密钥更新时…
    。我想先尝试
    更新
    ,如果发现的行数为0,则插入。您的客户端语言是什么?(PHP/C/Java/…)@RickJames我想在存储过程中使用它。您可能需要一个单独的
    从表1中选择COUNT(*),其中id=1
    ,才能获得该值。你为什么需要它?@RickJames我知道我可以,但尽量避免它,因为它会减慢执行速度。我正试图找到
    INSERT。。在重复密钥更新时…
    。我想先尝试
    更新
    ,如果找到的行数为0,则插入。