【问题标题】:Getting 'misuse of aggregate function MIN()' error when I try to delete rows from a table当我尝试从表中删除行时出现“滥用聚合函数 MIN()”错误
【发布时间】:2019-01-09 16:57:09
【问题描述】:

我在我的 Users 表上执行了以下测试 SQL 语句并得到了上述错误:

DELETE FROM Users
WHERE Username IS NOT 'Garikai' OR Username IS NOT 'Jane'

我不明白问题出在哪里,因为我的语句的任何部分显然都没有 MIN() 聚合函数。我怀疑操作数据库的软件存在错误(FWIW 它是 SQLiteStudio 3.2.1),但我可能错了。一些见解将不胜感激。

编辑:这是整个错误消息

[19:49:43] 对数据库“g_im”执行 SQL 查询时出错:误用 聚合函数 MIN()

【问题讨论】:

  • 您能否在问题edit 中包含您收到的错误消息的确切措辞?里面可能有些细节对你来说意义不大,但可以帮助其他人理解问题。
  • 那里的查询(如果有效)将删除表的所有行。 WHERE 子句中的过滤条件始终为真。您可能想使用AND 而不是OR。
  • 报错信息与delete sql语句无关,除非表有触发器或任何其他约束。
  • 显示您在Users 表上的所有触发器。
  • 正如我所说,此错误消息与此声明无关。我还在 SQLiteStudio 3.2.1 中复制了它,它运行良好。您正在执行的其他操作一定会触发此错误。

标签: sql database sqlite


【解决方案1】:

我想你可能想要查询:

DELETE FROM Users
WHERE Username <> 'Garikai' AND Username <> 'Jane'

【讨论】:

  • 我同意@The Impaler 的观点,但它没有解释奇怪的错误消息。应该还有问题
  • 在WHERE 逻辑上正确,但仍然是相同的消息
【解决方案2】:

正如 @forpas 和 @CL 在 cmets 中的直觉,这是一个触发问题。所以错误源于另一个表中的触发器Groups,它通过Groups 表中的外键GroupMember 引用链接到Users 表。外键设置为级联删除与已删除的Users 用户名匹配的记录,从而激活Groups 表中的 ON DELETE 触发器。 DELETE 触发器在其 WHERE 子句中具有聚合函数 MIN() ——在 SQLite 中,在 WHERE 子句中具有聚合函数显然是非法的——因此出现错误消息。这是原始的触发代码(也请原谅代码中的逻辑漏洞):

UPDATE Group_Members
SET Role = 'Admin'
WHERE JoinDate = MIN(JoinDate) AND GroupName = OLD.GroupName

这是我最终解决问题的方法:

UPDATE Group_Members
SET Role = 'Admin'
WHERE JoinDate = (SELECT MIN(JoinDate) FROM Group_Members WHERE GroupName = OLD.GroupName)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2014-05-31
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多