Eva*_*oll 6 postgresql mariadb sql-server insert sql-standard
我只是想知道如果您插入的列数少于表提供的列数,规范是否允许在INSERT语句中排除 column-list 子句。我看到 PostgreSQL 有,而 MySQL 和 SQL Server 没有。
使用 PostgreSQL,(有效)
# CREATE TABLE t (a int, b int);
CREATE TABLE
# INSERT INTO t VALUES (42); -- (b is set to DEFAULT)
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)
使用 SQL Server,我得到
Msg 213 Level 16 State 1 Line 1
Column name or number of supplied values does not match table definition.
Run Code Online (Sandbox Code Playgroud)
使用 MariaDB,我得到
Column count doesn't match value count at row 1
Run Code Online (Sandbox Code Playgroud)
如果列数不匹配,正确的行为是什么?
Len*_*art 12
可以在以下位置找到草稿文件:
http://www.wiscorp.com/sql20nn.zip
Run Code Online (Sandbox Code Playgroud)
这个问题感兴趣的部分是:
7IWD2-02-Foundation-2011-12.pdf
Run Code Online (Sandbox Code Playgroud)
起初,我根本找不到任何支持忽略列规范。但是,在 14.11 中,BNF 看起来像:
<insert statement> ::=
INSERT INTO <insertion target> <insert columns and source>
[...]
<insert columns and source> ::=
<from subquery>
| <from constructor>
| <from default>
<from subquery> ::=
[ <left paren> <insert column list> <right paren> ]
[ <override clause> ]
<query expression>
<from constructor> ::=
[ <left paren> <insert column list> <right paren> ]
[ <override clause> ]
<contextually typed table value constructor>
<insert column list> ::=
<column name list>
Run Code Online (Sandbox Code Playgroud)
即“列名称列表”包含在方括号内,因此可能有也可能没有列规范。但是,在语法规则下的文本中,它提到:
7) If the <insert column list> is omitted, then an
<insert column list> that identifies all columns of T in the
ascending sequence of their ordinal positions within T is implicit.
Run Code Online (Sandbox Code Playgroud)
因此,似乎如果省略列列表,则假定所有列并且应从左到右解释它们。我的猜测是 PostgreSQL 在这方面太慷慨了。
为清楚起见,我认为始终声明列列表是个好主意(临时情况除外)。我可以将 Db2 (10.5) 添加到需要部分元组的列列表的产品中:
db2 "INSERT INTO t VALUES (42)"
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0117N The number of values assigned is not the same as the number of specified or implied columns or variables. SQLSTATE=42802
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |