Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用键列的Where子句仍然给出错误_Mysql - Fatal编程技术网

Mysql 使用键列的Where子句仍然给出错误

Mysql 使用键列的Where子句仍然给出错误,mysql,Mysql,我有一个表,用作另一个表的外键查找。该表非常简单,包含一个ID列,其中包含的是主键和一个JSON列。我希望从此表中删除放弃的条目 我尝试运行以下脚本: DELETE FROM `ate`.`test_configuration` WHERE `ate`.`test_configuration`.`ID` NOT IN (SELECT DISTINCT `ate`.`index`.`TestID` from `ate`.`index`); 但遇到一个错误,表明我没有使用使用使用键列的where

我有一个表,用作另一个表的外键查找。该表非常简单,包含一个ID列,其中包含的是主键和一个JSON列。我希望从此表中删除放弃的条目

我尝试运行以下脚本:

DELETE 
FROM `ate`.`test_configuration`
WHERE `ate`.`test_configuration`.`ID` NOT IN (SELECT DISTINCT `ate`.`index`.`TestID` from `ate`.`index`);
但遇到一个错误,表明我没有使用使用使用键列的where子句:

错误代码:1175。您正在使用安全更新模式,并且您试图更新一个不带WHERE的表,该表使用键列禁用安全模式,请在“首选项”->“SQL编辑器”中切换该选项,然后重新连接


这令人困惑,因为my where子句使用主键列。我知道我可以作为一个解决办法,但仍然想了解为什么我会出现这个错误。如果可能的话,我希望避免不安全的更新。

我认为优化器无法有效地使用索引进行此类查询,所以它会进行全表扫描

测试_配置中有多少行,其中有多少行将被删除


(您可能会尝试使用索引提示来强制优化器使用索引进行查询,只是不确定您的mysql版本是否支持索引)。

也许这个答案可以帮助您理解这是问题所在,但我正在尝试实现第一个解决方案,而不是第二个解决方案。我的where子句使用了他们建议的索引。这个表很小。表中大约有600行,我正试图删除其中的400行(大部分是相同数据的转换版本)。虽然我使用的是MySql 5.7.11,它确实支持索引提示,但它们似乎只适用于select语句。安全查询错误是关于优化还是数据完整性?我的印象是,需要密钥的主要原因是验证您正在更改要更改的行(该行将由密钥唯一标识)。我相信它的实现非常简单—如果没有使用索引—生成警告。从优化器的角度来看,如果大多数行都将被删除,那么只进行表扫描就更简单了。我百分之百确信忽略这个针对小表的特别警告是安全的。很抱歉回复的时间长了,我很抱歉没有通知我这些评论
ID
是主键,因此具有主索引。这是我的一个问题,我的问题不是我如何回避这个问题,而是为什么它会发生。当我与表的主键进行比较时,错误根本不应该存在。我想我不理解您的说法,即不使用索引直接导致了错误,因为这根本不是错误所说的。它没有提到索引。我不明白为什么它不使用索引,因为这个查询所需的所有数据都应该存在,但更重要的是,我根本不明白为什么索引与这个错误有关。如果你是对的,除了我已经找到的解决方法之外,可能没有解决方案,但我真的很讨厌在不完全了解情况的情况下实施这些事情,我可以考虑引入“安全更新模式”的两个原因:1。在大型表的各种情况下,不带索引的更新可能会对性能和锁定造成重大影响。2.这可能是一个迹象,表明用户不明白他们在做什么。这两者都与你的处境无关。是的,我认为服务器并没有足够的智能来区分索引出现的位置,但由于优化器的选择而没有使用。(可能只是信息中的措辞混淆了)。所以,是的,我认为你应该在这种情况下解决它,然后忘记它