mysql - mysql 查询出现异常错误 "delete"

标签 mysql bash sql-delete

我有以下在 shell 脚本中运行的 mysql 代码:

mysql  -u "$DB_USER" -p"$DB_PASSWD" "$DB_SOURCE" << MYSQLEOF

DELETE FROM list_subscriber_events WHERE subscriberid IN
(SELECT subscriberid FROM
(SELECT subscriberid FROM `list_subscriber_events` WHERE subscriberid NOT IN
(SELECT subscriberid FROM list_subscribers)) AS c);

MYSQLEOF

当从 mysql 命令行运行删除查询时,我没有任何问题 - 它运行正常。

但是,当在 bash 脚本中运行它时,我收到以下错误:

ERROR 1064 (42000) at line 4: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE subscriberid NOT IN
(SELECT subscriberid FROM list_subscribers)) AS c)' at line 3
ssh exited with exit code 1

我花了几个小时尝试各种变体 - 我似乎无法解决它。任何帮助将不胜感激 - 我可能错过了一些明显的东西。

最佳答案

尝试删除反引号字符

   FROM `list_subscriber_events` WHERE
        ^                      ^

在 shell 命令行的上下文中,这些反引号表示需要运行的内容,并且其返回值将被替换。

我怀疑 shell 正在解释这些反引号,并尝试执行 list_subscriber_events,这可能会返回错误。结果是它被替换为空字符串...结果语句是

 ... FROM WHERE ...

如果必须包含反引号,则在反引号前面添加反斜杠字符可能会将其转义。

跟进

在完全不同的情况下,似乎您有更多必要的内联 View 。如果子查询返回 NULL 值,则 NOT IN 可能会出现“陷阱”。 (也许您可以保证 list_subscribers 中的 subscriberid 不为 NULL。或者,也许您确实希望子查询返回 NULL 值时我们得到的行为。)

看起来是一个更简单的查询,使用反连接模式将完成您似乎想要的结果...从 list_subscriber_events 中删除 subscriberid 中的行> 值未出现在 list_subscribers

  DELETE e.*
    FROM list_subscriber_events e
    LEFT
    JOIN list_subscribers l
      ON l.subscriberid = d.subscriberid
   WHERE l.subscriberid IS NULL

关于mysql - mysql 查询出现异常错误 "delete",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31236306/

相关文章:

MySQL存储过程循环问题

MySQL删除所有字段的前两个字符

sql-server - 从应用于另一个表的条件中找到 ID 的 SQL 表中删除

mysql删除和外键约束

mysql - 对于不存在的 ID,我是否需要在 SQL 表中使用 NULL 值

php - 为什么 json_encode 返回 null?

bash - bash脚本-字符串比较产生意外结果

python - 忽略错误代码 141 的 Bash pipefail

linux - bash 子字符串在解释器模式下工作但不在 shell 脚本中

mysql - 如何更快地删除重复项?