以下错误只适用于子查询。本节把这些错误归在一起。
· 来自子查询的列的数目不正确
· ERROR 1241 (ER_OPERAND_COL) · SQLSTATE = 21000 · Message = "Operand should contain 1 column(s)"
在出现以下情况时,发生此错误:
SELECT (SELECT column1, column2 FROM t2) FROM t1;
如果您的目的是进行比较,您可以使用能返回多个列的子查询。请参见13.2.8.5节,“行子查询”。不过,在其它的语境下,子查询必须为标量操作数。
· 来自子查询的行的数目不正确:
· ERROR 1242 (ER_SUBSELECT_NO_1_ROW) · SQLSTATE = 21000 · Message = "Subquery returns more than 1 row"
如果在语句中,子查询返回的行多于一个,则发生此错误。请考虑以下例子:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
如果SELECT column1 FROM t2只返回一行,则将执行以前的查询。如果子查询返回的行多于一个,则将出现错误1242。在这种情况下,该查询将被改写为:
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
· 在子查询中表格使用不正确:
· Error 1093 (ER_UPDATE_TABLE_USED) · SQLSTATE = HY000 · Message = "You can't specify target table 'x' · for update in FROM clause"
在如下情况下,发生该错误:
UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
和SELECT语句一样,在UPDATE和DELETE语句中,子查询是合法的。所以您可以在UPDATE语句中使用子查询进行赋值。不过,您不能把同一个表(在本例中为表t1)既用于子查询的FROM子句,又用于更新目标。
对于事务存储引擎,子查询的错误会导致整个语句失效。对于非事务存储引擎,在遇到错误之前进行的数据修订会被保留。