规范是否允许 INSERT 上的列数不匹配?

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)

如果列数不匹配,正确的行为是什么?

受此问题的回复和评论启发的问题here

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)