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

Unusual error in mysql "delete" query

我在 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 命令行的上下文中,这些反引号表示需要 运行 的内容,并替换其中的 return。

我怀疑 shell 正在解释那些反引号,并试图执行 list_subscriber_events,这很可能 return 出错了。结果是这被替换为空字符串...结果语句是

 ... FROM WHERE ...

如果您必须包含反引号,可能在反引号前加上反斜杠字符会对其进行转义。

跟进

换句话说,您似乎有更多必要的内联视图。如果子查询 return 是 NULL 值,则 NOT IN 可能存在 "gotcha"。 (也许您可以保证 subscriberidlist_subscribers 中不为 NULL。或者,也许您确实想要当子查询 return 为 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