【发布时间】:2020-10-09 00:16:19
【问题描述】:
请对照Sakila 示例数据库检查我在 MySQL 8.0 中运行的以下 UPDATE 语句:
UPDATE `film`
SET
`original_language_id` = FLOOR(1 + (RAND() * 6))
WHERE
`film_id` = FLOOR(1 + (RAND() * 1000));
想法是从film 更新一个随机行,使该行的original_language_id 列键的值介于1 和6 之间。
film 表中有 1000 行,PK 从 1 到 1000。original_language_id 列是 language 表的外键。 language 表中有 6 行,PK 从 1 到 6。
MySQL 认为上述 UPDATE 语句不安全(错误 1175)。 (我很想知道为什么,但这不是我的问题)。所以为了强制语句运行,我在它前面加上:SET SQL_SAFE_UPDATES = 0;。
当我运行我希望在输出窗口中看到的 UPDATE 语句时:
1 行受影响行匹配:1 更改:1 警告:0
但我有时会受到 0 行的影响,有时是 1 行,有时是 2 行!
我的问题是为什么这个 UPDATE 语句不始终影响一行且只影响一行?
PS - 请避免 cmets 关于查询是否对您有意义和/或谨慎禁用安全更新模式。该查询是用于学习目的的练习,我完全意识到所述模式的重要性。谢谢。
【问题讨论】:
-
“我很想知道原因,但这不是我的问题” 软件警告您查询不安全,但您故意忽略它并忽略了警告。然后你得到了意想不到的结果,想知道为什么?你应该关注警告!!!
标签: mysql sql random sql-update sql-order-by