这个查询真的不安全吗?
Is this query really unsafe?
以下查询正在按需要执行,但是当我通过我的远程管理工具 (heidisql) 执行时,我收到一条消息指出:
Note: Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.
查询如下:
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
这可能是误报还是此查询有问题,即使它看起来正在执行所需的操作?
如果您有一个 table,其键值为 1、2、3,并且您希望这些值从零开始,您可以说 set key = key - 1
,对于大多数 DBMS,就足够了。但是,在这方面,MySQL 与大多数 DBMS 不同。假设它首先尝试更新 ID=3 的行。减一,新的 ID 为 2。但是 table 中已经有 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。查找以 "If an UPDATE statement includes an ORDER BY clause..."
开头的段落
以下查询正在按需要执行,但是当我通过我的远程管理工具 (heidisql) 执行时,我收到一条消息指出:
Note: Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.
查询如下:
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
这可能是误报还是此查询有问题,即使它看起来正在执行所需的操作?
如果您有一个 table,其键值为 1、2、3,并且您希望这些值从零开始,您可以说 set key = key - 1
,对于大多数 DBMS,就足够了。但是,在这方面,MySQL 与大多数 DBMS 不同。假设它首先尝试更新 ID=3 的行。减一,新的 ID 为 2。但是 table 中已经有 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。查找以 "If an UPDATE statement includes an ORDER BY clause..."
开头的段落