离开这个答案,我想知道为什么词法分析器允许它在这个语句中一直深入到几何语法INSERT
CREATE TABLE foo ( x varchar(255) );
> INSERT INTO foo VALUES ( x='foo' );
Query OK, 1 row affected (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
我知道这是不对的,正如上面的答案表明应该是这样INSERT INTO tbl SET
,但是发生了什么?MySQL 是如何解释的?在 PostgreSQL 中,这种语法被拒绝。
test=# CREATE TABLE foo ( x varchar(255) );
INSERT INTO foo VALUES ( x='foo' );
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
如果它不存在,则会出现错误。我不确定如果它确实存在会发生什么。NULL
已插入,但为什么呢?为什么那会少一点错误。有人可以解释一下吗?
我知道 MySQL 有一个用户定义的变量语法,但是我认为这与这里没有任何关系。
当您使用此命令创建表时
CREATE TABLE foo ( x varchar(255) );
Run Code Online (Sandbox Code Playgroud)
列x
是使用隐式默认值定义的NULL
。
当您像在获得NULL
.
说到你给出的表达式,x=5
,你问的是 if NULL
equals 5. 在语义方面,NULL
不能与任何东西相比:
mysql> select NULL = 5;
+----------+
| NULL = 5 |
+----------+
| NULL |
+----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
甚至不与NULL
自己
mysql> select NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
| NULL |
+-------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
它需要一个内容上下文(如果这有意义的话)。
无论如何,当您尝试评估时x=5
,它会在内部作为评估进行处理x
,这当然是NULL
随着行的存在,然后与 的非空值进行比较5
。由于表达式必须计算为NULL
,因此您基本上是这样做的:
mysql> insert into foo values (NULL);
Query OK, 1 row affected (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
这与执行此操作具有相同的效果
mysql> insert into foo values ();
Query OK, 1 row affected (0.01 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
638 次 |
最近记录: |