这个查询真的不安全吗?

时间:2015-03-14 22:22:50

标签: mysql sql database mariadb

以下查询正在按需执行但是当我通过我的远程管理工具(heidisql)执行时,我收到的消息表明:

  

注意:自BINLOG_FORMAT = STATEMENT以来,使用语句格式将不安全语句写入二进制日志。从另一个表中选择后,使用自动增量列写入表的语句是不安全的,因为检索行的顺序决定了将写入哪些行(如果有)。此订单无法预测,可能在主设备和从设备上有所不同。

查询如下:

UPDATE t016sliderimages AS t016

JOIN t004images AS t004
ON t004.ImageID = t016.ImageID

JOIN t034imagealbums AS t034
ON t004.ImageAlbumID = t034.ImageAlbumID


SET t016.SliderNumber = t016.SliderNumber - 1

WHERE t034.ItemID = 32
AND t016.SliderNumber > 4

这可能是误报,或者这个查询是否有问题,即使它看起来像是在做什么?

1 个答案:

答案 0 :(得分:3)

如果您的表格的键值为1,2,3,并且您希望值从零开始,则可以说set key = key - 1,对于大多数DBMS来说,这样就足够了。但是,在这方面,MySQL并不像大多数DBMS那样。假设它首先尝试更新ID = 3的行。减去一个,新ID将是2.但是表中已经存在ID = 2的行。坏妈。

所以,这又适用于MySQL(我知道),您必须明确指定order by,以便不会发生此类冲突。在这种情况下,您必须强制它从最低值开始并进行处理。

    SET t016.SliderNumber = t016.SliderNumber - 1
WHERE   t034.ItemID = 32
    AND t016.SliderNumber > 4
ORDER BY t016.SliderNumber ASC;

但是,你从大于4的值开始。所以如果高于它的第一个值是5,那么你必须确保没有值= 4. KnoWhaddaMean?

更新:我发现了reference这种行为。查找以“如果UPDATE语句包含ORDER BY子句......”

开头的段落