以下查询正在按需执行但是当我通过我的远程管理工具(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
这可能是误报,或者这个查询是否有问题,即使它看起来像是在做什么?
答案 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子句......”
开头的段落