SQL 1064 - 跨多个表删除时,您的 SQL 语法有错误
Posted
技术标签:
【中文标题】SQL 1064 - 跨多个表删除时,您的 SQL 语法有错误【英文标题】:SQL 1064 - You have an error in your SQL syntax when deleting across multiple tables 【发布时间】:2014-09-02 16:38:17 【问题描述】:我正在尝试删除多个日志表中的特定行,用于超过 5 天的活动。但是如果在 log_customer 中找到了 visitor_id,则希望保留日志活动。
以下返回超过 42 K 行:
SELECT *
FROM `log_url` , `log_url_info`, `log_visitor_info`, `log_visitor`
WHERE `log_url`.`visit_time` <= NOW( ) - INTERVAL 5
DAY
AND `log_url`.`url_id` = `log_url_info`.`url_id`
AND `log_url`.`visitor_id` = `log_visitor`.`visitor_id`
AND `log_url`.`visitor_id` = `log_visitor_info`.`visitor_id`
AND `log_url`.`visitor_id` NOT IN ( select `log_customer`.`visitor_id` from `log_customer` )
但是,这会返回 sql 1064 错误:
DELETE
FROM `log_url` , `log_url_info`, `log_visitor_info`, `log_visitor`
WHERE `log_url`.`visit_time` <= NOW( ) - INTERVAL 5
DAY
AND `log_url`.`url_id` = `log_url_info`.`url_id`
AND `log_url`.`visitor_id` = `log_visitor`.`visitor_id`
AND `log_url`.`visitor_id` = `log_visitor_info`.`visitor_id`
AND `log_url`.`visitor_id` NOT IN ( select `log_customer`.`visitor_id` from `log_customer` )
错误信息:
#1064 - 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 log_url.visit_time
<= NOW( ) - INTERVAL 5 DAY AND log_url.url_id' at line 3
我也得到...
#1064 - 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 log_url.visit_time
<= STR_TO_DATE('2014-08-21 10:00:00', '%Y-%m-%d %H:' at line 3
...如果我将NOW()
...替换为<= STR_TO_DATE( '2014-08-21 10:00:00', '%Y-%m-%d %H:%i:%s' )
【问题讨论】:
具体报错信息是什么?这可能会帮助您找出 MySQL 语法错误的位置。 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 'WHERElog_url
.visit_time
log_url.url_id
' 附近使用正确的语法我也得到了#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'WHERE log_url
.visit_time
【参考方案1】:
那不应该是……
DELETE `log_url` , `log_url_info`, `log_visitor_info`, `log_visitor`
FROM `log_url` , `log_url_info`, `log_visitor_info`, `log_visitor`
WHERE `log_url`.`visit_time` <= NOW( ) - INTERVAL 5 DAY
AND `log_url`.`url_id` = `log_url_info`.`url_id`
AND `log_url`.`visitor_id` = `log_visitor`.`visitor_id`
AND `log_url`.`visitor_id` = `log_visitor_info`.`visitor_id`
AND `log_url`.`visitor_id` NOT IN ( select `log_customer`.`visitor_id` from log_customer` )
甚至……
DELETE u
, ui
, vi
, v
FROM log_url u
JOIN log_url_info ui
ON ui.url_id = u.url_id
JOIN log_visitor_info vi
ON vi.visitor_id = u.visitor_id
JOIN log_visitor v
ON v.visitor_id = u.visitor_id
WHERE u.visit_time <= NOW( ) - INTERVAL 5 DAY
AND u.visitor_id NOT IN ( SELECT visitor_id FROM log_customer)
【讨论】:
当然!从...中删除log_url
、log_url_info
、log_visitor_info
、log_visitor
感谢您提供更优雅的加入选项!以上是关于SQL 1064 - 跨多个表删除时,您的 SQL 语法有错误的主要内容,如果未能解决你的问题,请参考以下文章
#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册
SQLSTATE [42000]:语法错误或访问冲突:1064 在进行迁移时,您的 SQL 语法有错误
从 MySQL 表 1064 读取数据时出错 (42000)
我的 SQL 错误:错误 1064:您的 SQL 语法有错误;