我试图了解MYSQL是如何确定单表和多表语法的,但我找不到这些信息。文档解释了MYSQL如何处理这两者,但它没有解释是什么决定了两者。
文件上说:
可以在DELETE语句中指定多个表,以便根据WHERE子句中的特定条件从一个或多个表中删除行。但是,不能在多表删除中使用ORDER或ORDER.
以这个查询为例:
DELETE table FROM table
INNER JOIN other ON other.column = table.column
WHERE other.column2 = ?
LIMIT 1这是单表语法还是多表语法?有一个JOIN,所以您可以倾向于多个,但它只是从一个表中删除。我的另一个怀疑是,它是由多个WHERE子句用于多个表的时间决定的。如果你能在你的回答中包括这两者的例子,这将是非常感谢的!
编辑:
我之所以问这个问题,是因为当使用DELETE执行特定的LIMIT查询时,会出现一个错误,您不能在多个表语法中使用LIMIT。
简单地说,编辑2:,如果要在DELETE查询中连接表,则不能使用ORDER BY或LIMIT。
发布于 2015-01-17 22:57:32
关于“单表”synatax:
如果指定ORDER子句,则按指定的顺序删除行。限制子句限制可以删除的行数。
关于“多表”语法:
对于多表语法,删除每个tbl_name中符合条件的行。在这种情况下,不能使用。
一些测试揭示了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服务器版本相对应的手册,以便在第1行使用接近“按时间戳限制2顺序”的语法。
使用隐式联接指定相同查询的方式相同。
DELETE table1
FROM table1, table2
WHERE
table1.id = table2.id
AND somecol = 'someval'
ORDER BY timestamp LIMIT 2您的SQL语法出现了错误;请检查与您的MariaDB服务器版本相对应的手册,以便在第1行使用接近“按时间戳限制2顺序”的语法。
在DELETE之后指定在joined (多表)语句中删除的表,因此它看起来更像是单表语法,这也是语法错误。
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”
它是在DELETE子句中命名的表:
最后,只使用一个表,但使用多表语法(以DELETE关键字命名表)不允许使用ORDER BY,因此,此处真正的标识区别似乎是在子句中命名的表,以区分多表和单表:
此查询只涉及一个表(没有联接),但会产生语法错误:
/* name table1 in the DELETE clause */
DELETE table1
/* but not other table is joined */
FROM table1
WHERE somecol = 'someval'
ORDER BY id LIMIT 2您的SQL语法有错误;请检查与您的MariaDB服务器版本对应的手册,以获得正确的语法,以便使用接近“ORDER限制1”。
发布于 2015-01-17 22:46:00
如果您指定您只从一个表中DELETE,并且DELETE语句中没有涉及到JOIN,那么这是一个单表语法。否则,这是一种多表语法。我很确定这就是doc页面的意思。
我认为这一解释的一个证据是,下面这一页写着:
table_references子句列出了连接中涉及的表。其语法在13.2.8.2节“联接语法”中进行了描述。
注意,在单表语法中没有table_references元素。
https://stackoverflow.com/questions/28004962
复制相似问题