mysql“删除”查询中的异常错误

时间:2015-07-06 00:16:19

标签: mysql bash sql-delete

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

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

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

1 个答案:

答案 0 :(得分:0)

尝试删除反引号字符

   FROM `list_subscriber_events` WHERE
        ^                      ^

在shell命令行的上下文中,那些反引号表示需要运行的东西,并且从中返回它。

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

 ... FROM WHERE ...

如果你必须包含反引号,可能在反斜杠前面加一个反斜杠字符就会逃脱它。

<强>后续

完全不同的是,您似乎有更多内联视图是必要的。并且有潜力&#34;陷阱&#34;如果子查询返回NULL值,则使用NOT IN。 (也许您可以保证subscriberidlist_subscribers不为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