我试图了解MYSQL如何确定单表和多表语法,但我无法找到此信息。 documentation解释了MYSQL如何处理这两者,但它并没有解释是什么决定了它们。
文档说:
您可以在DELETE语句中指定多个表来删除行 来自一个或多个表,取决于特定条件 WHERE子句。但是,您不能在a中使用ORDER BY或LIMIT 多表DELETE。
以此查询为例:
DELETE table FROM table
INNER JOIN other ON other.column = table.column
WHERE other.column2 = ?
LIMIT 1
这是单个还是多个表语法?有一个JOIN
,所以你可以倾向于多个,但它只能从一个表中删除。我怀疑的是,确定多个WHERE
子句用于多个表时。如果您可以在答案中包含两者的示例,那将非常感激!
编辑:
我问这个问题是因为在使用DELETE
执行某些LIMIT
查询时出现错误,您无法使用LIMIT
多表语法。
编辑#2:
简而言之,如果要在ORDER BY
查询中加入表格,则无法使用LIMIT
或DELETE
。
答案 0 :(得分:1)
MySQL's documentation states the following
关于"单表" synatax:
如果指定了ORDER BY子句,则按指定的顺序删除行。 LIMIT子句限制了可以删除的行数。
关于"多表"语法:
对于多表语法,DELETE从每个tbl_name中删除满足条件的行。在这种情况下,不能使用ORDER BY和LIMIT。
有些测试揭示了ORDER BY
限制的问题。
这是一个有效的单表DELETE
语句ORDER BY
:
DELETE FROM table
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2
对于另一个表使用显式连接条件的类似查询导致ORDER BY
上的语法错误,尽管只有一个表被删除:
DELETE table1
FROM table1 JOIN table2 ON table1.id = table2.id
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2
您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以获得正确的语法,以便在时间戳限制2' ORDER BY timestamp LIMIT 2'在第1行
使用隐式连接指定相同的查询失败的方式相同
DELETE table1
FROM table1, table2
WHERE
table1.id = table2.id
AND somecol = 'someval'
ORDER BY timestamp LIMIT 2
您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以获得正确的语法,以便在时间戳限制2' ORDER BY timestamp LIMIT 2'在第1行
在联接(多表)语句中删除DELETE
之后没有表进行删除,因此它看起来更像单表语法也是语法错误
DELETE /* no table named here */
FROM table1 JOIN table2 ON table1.id = table2.id
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2
您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在#< WHERE somecol附近使用正确的语法
DELETE
子句中指定的表:最后,使用只有一个表,但使用多表语法(在DELETE
关键字后面命名一个表)不允许{{ 1}},所以这里的真正识别差异似乎是在ORDER BY
子句中命名的表,以区分多表和单表:
此查询仅涉及一个表(没有连接),但会产生语法错误:
DELETE
您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在#OR; ORDER BY id LIMIT 1附近使用正确的语法
答案 1 :(得分:0)
如果您仅从1个表中指定DELETE
并且JOIN
语句中没有DELETE
,那么它就是单表语法。否则,它是一个多表语法。我很确定这是doc页面的含义。
我认为这种解释的证据就是页面上写着:
table_references子句列出了连接中涉及的表。它的语法在第13.2.8.2节“JOIN语法”中描述。
请注意,在单表语法中没有table_references
元素。