首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >k=v在插入tbl值(expr)的上下文中做了什么?

问k=v在插入tbl值(expr)的上下文中做了什么?
EN

Database Administration用户
提问于 2017-12-28 17:44:58
回答 1查看 769关注 0票数 3

说到这个答案,,我想知道为什么词法器允许它一直到这个INSERT语句中的几何语法

代码语言:javascript
复制
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中,这样的语法被拒绝。

代码语言:javascript
复制
test=# CREATE TABLE foo ( x varchar(255) );
INSERT INTO foo VALUES ( x='foo' );

PostgreSQL将其解释为列引用和输出错误,进一步提供了提示。

代码语言:javascript
复制
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似乎在检查字段名是否在运行时存在,但最终我不知道。

代码语言:javascript
复制
> 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有一个用户定义变量语法,但是我认为这和这里没有任何关系。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2017-12-28 20:22:12

当您使用以下命令创建表时

代码语言:javascript
复制
CREATE TABLE foo ( x varchar(255) );

列x被定义为隐式默认值NULL。

当您将一个不存在的变量与实际值进行比较时,就像在获得NULL之前所做的那样。

当谈到您给出的表达式x=5时,您会问NULL是否等于5。就系统学而言,NULL不能与任何事物相比:

代码语言:javascript
复制
mysql> select NULL = 5;
+----------+
| NULL = 5 |
+----------+
|     NULL |
+----------+
1 row in set (0.00 sec)

即使对NULL本身也没有

代码语言:javascript
复制
mysql> select NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

它需要一个内容上下文(如果有意义的话)。

无论如何,当您试图计算x=5时,它会在内部处理为计算x,当然,这是NULL,行将出现,然后与5的非空值进行比较。由于表达式必须计算为NULL,因此基本上是这样做的:

代码语言:javascript
复制
mysql> insert into foo values (NULL);
Query OK, 1 row affected (0.00 sec)

mysql>

它的效果与执行此操作相同

代码语言:javascript
复制
mysql> insert into foo values ();
Query OK, 1 row affected (0.01 sec)

mysql>
票数 6
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/194120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档