说到这个答案,,我想知道为什么词法器允许它一直到这个INSERT语句中的几何语法
CREATE TABLE foo ( x varchar(255) );
> INSERT INTO foo VALUES ( x='foo' );
Query OK, 1 row affected (0.01 sec)我知道这是不对的,如上面的答案所示说应该是INSERT INTO tbl SET,但是发生了什么呢?MySQL是如何解释这个的?在PostgreSQL中,这样的语法被拒绝。
test=# CREATE TABLE foo ( x varchar(255) );
INSERT INTO foo VALUES ( x='foo' );PostgreSQL将其解释为列引用和输出错误,进一步提供了提示。
ERROR: column "x" does not exist
LINE 1: INSERT INTO foo VALUES ( x='foo' );
HINT: There is a column named "x" in table "foo", but it cannot be referenced
from this part of the query.MySQL似乎在检查字段名是否在运行时存在,但最终我不知道。
> INSERT INTO foo VALUES ( DOESNOTEXIST=5 );
ERROR 1054 (42S22): Unknown column 'DOESNOTEXIST' in 'field list'
> INSERT INTO foo VALUES ( x=5 );
Query OK, 1 row affected (0.01 sec)如果它不存在,您将得到一个错误。但我不知道如果它真的存在会发生什么。插入了NULL,但为什么?为什么那就少了一个错误。有人能解释一下吗?
我知道MySQL有一个用户定义变量语法,但是我认为这和这里没有任何关系。
发布于 2017-12-28 20:22:12
当您使用以下命令创建表时
CREATE TABLE foo ( x varchar(255) );列x被定义为隐式默认值NULL。
当您将一个不存在的变量与实际值进行比较时,就像在获得NULL之前所做的那样。
当谈到您给出的表达式x=5时,您会问NULL是否等于5。就系统学而言,NULL不能与任何事物相比:
mysql> select NULL = 5;
+----------+
| NULL = 5 |
+----------+
| NULL |
+----------+
1 row in set (0.00 sec)即使对NULL本身也没有
mysql> select NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
| NULL |
+-------------+
1 row in set (0.00 sec)它需要一个内容上下文(如果有意义的话)。
无论如何,当您试图计算x=5时,它会在内部处理为计算x,当然,这是NULL,行将出现,然后与5的非空值进行比较。由于表达式必须计算为NULL,因此基本上是这样做的:
mysql> insert into foo values (NULL);
Query OK, 1 row affected (0.00 sec)
mysql>它的效果与执行此操作相同
mysql> insert into foo values ();
Query OK, 1 row affected (0.01 sec)
mysql>https://dba.stackexchange.com/questions/194120
复制相似问题