具有相同where子句的SELECT和UPDATE查询获得不同的行计数结果?

问题描述 投票:0回答:1

使用MySQL 5.6。

我正在使用更新查询

UPDATE listtimeentry 
SET quoteId = 5683, 
lastAlteredQte="2020-04-10 11:06:14", 
userIdQte=1112, 
roleIdQte=10 
WHERE soId = 2488 AND quoteId IS NULL;

告诉我0行受到影响,0行被匹配,所以没有任何更新。当我知道数据是什么并且知道应该受到某些影响时,这使我感到困惑。所以我用相同的条件做了一个SELECT-

SELECT * FROM listtimeentry
WHERE soId = 2488 AND quoteId IS NULL;

这将返回4行给我。我的UPDATE如何不影响任何事物,而具有相同条件的SELECT则表明应该受到影响?关于此数据库的另一个事实是SQL_SAFE_UPDATES已关闭。

[怎么回事,如何更改UPDATE语句以影响SELECT语句正在抓取的4行?

编辑:如果我运行选择查询,我会得到这个

id    soId    quoteId    userIdQte    roleIdQte    lastAlteredQte
=======================================================
101   2488    NULL       NULL         NULL         NULL
106   2488    NULL       NULL         NULL         NULL
192   2488    NULL       NULL         NULL         NULL
206   2488    NULL       NULL         NULL         NULL

以及SHOW CREATE陈述的相关部分

CREATE TABLE `listtimeentry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `soId` int(11) DEFAULT NULL,
  `roleIdQte` int(11) DEFAULT NULL,
  `userIdQte` int(11) DEFAULT NULL,
  `lastAlteredQte` datetime DEFAULT NULL,
  `lastAlteredAfterConfirmationQte` datetime DEFAULT NULL,
  `notNeeded` int(11) DEFAULT NULL,
  `qteNeeded` int(11) DEFAULT '0',
  `quoteId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `userIdQte` (`userIdQte`),
  CONSTRAINT `listtimeentry_ibfk_3` FOREIGN KEY (`userIdQte`) REFERENCES `listusers` (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=118783 DEFAULT CHARSET=latin1;

listtimeentry之后运行的表INSERT有一个触发器

BEGIN
    INSERT INTO `tab`.`listlineitems` SET 
    `listlineitems`.`itemId` = NEW.`id`,
    `listlineitems`.`type` = 1;
END

编辑:关闭此。我的服务器出了点问题。我以某种方式通过SELECT语句获取了缓存的结果,但是当UPDATE尝试运行时,它失败了。我重新启动了MySQL 5.6 Server,一切正常。不过,我不知道是什么原因造成的。

mysql mysql-5.6
1个回答
0
投票

当您运行UPDATE语句时-MySQL不会更新新值与旧值相同的列。这可能会导致受影响的行数实际上可能不等于匹配的行数,而实际上仅等于该查询实际影响的行数。

如果需要,可以使用REPLACE语句,该语句首先删除具有相同主键的记录,然后插入新行。

© www.soinside.com 2019 - 2024. All rights reserved.