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"。 (也许您可以保证 subscriberid
在 list_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
我在 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"。 (也许您可以保证 subscriberid
在 list_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