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() ...替换为&lt;= STR_TO_DATE( '2014-08-21 10:00:00', '%Y-%m-%d %H:%i:%s' )

【问题讨论】:

具体报错信息是什么?这可能会帮助您找出 MySQL 语法错误的位置。 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 'WHERE log_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_urllog_url_infolog_visitor_infolog_visitor感谢您提供更优雅的加入选项!

以上是关于SQL 1064 - 跨多个表删除时,您的 SQL 语法有错误的主要内容,如果未能解决你的问题,请参考以下文章

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册

SQLSTATE [42000]:语法错误或访问冲突:1064 在进行迁移时,您的 SQL 语法有错误

从 MySQL 表 1064 读取数据时出错 (42000)

我的 SQL 错误:错误 1064:您的 SQL 语法有错误;

Laravel 6 - SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;

SQL 错误 1064:您的 SQL 语法有错误