22212


**前提**

[code]

    CREATE TABLE t (
      a INT
    );
    
[/code]

* * *

**質問1**  
・下記は何を挿入しているのでしょうか？  
・デフォルト値？ NULL？ 空文字？

[code]

    INSERT INTO t VALUES();
    
[/code]

* * *

**質問2**  
・下記はなぜ「Column count doesn't match value count」エラーになるのでしょうか？

[code]

    INSERT INTO t (a) VALUES ();
    
[/code]

・下記ならエラーとならないのに…

[code]

    INSERT INTO t VALUES (1);
    
    INSERT INTO t (a) VALUES(1); 
    
[/code]

* * *

**質問3**  
・DEFAULT句 と DEFAULT関数 は同じ意味？  
・どちらを使った方が良い、とかありますか？

[code]

    INSERT INTO t VALUES(DEFAULT);
    
    INSERT INTO t VALUES(DEFAULT(a));
    
[/code]

* * *

**質問4**  
・DEFAULT句 は公式マニュアルのどこに掲載されているでしょうか？  
・キーワード？ 構文の一種？ それとも関数の省略形？


CC BY-SA 3.0
2016-02-17T08:41:19.530
22203
2016-02-17T11:52:09.773
2016-02-17T10:44:05.227
8000
7886
question
mysql
デフォルト値指定について


以下 [MySQL 5.6 リファレンスマニュアル :: 13.2.5 INSERT
構文](http://dev.mysql.com/doc/refman/5.6/ja/insert.html)に基づいて回答します。

**質問1**

[code]

    INSERT INTO t VALUES();
    
[/code]

カラム a は `NOT NULL` ではないので、デフォルト値であるNULLが挿入されます。`DEFAULT`
で任意の値が設定されていれば、その値が挿入されます。

`STRICT_TRANS_TABLES` などによって厳密モードになっている場合はこれだけですが、厳密モードでない場合は `NOT NULL` かつ
`DEFAULT` がない時に型ごとのデフォルト値が挿入されます。  
※複数行を一度に挿入・更新する場合は厳密モードでもエラーにならない場合があります。詳細は[マニュアル](http://dev.mysql.com/doc/refman/5.6/ja/sql-
mode.html#sql-mode-strict)参照。

> デフォルト値？ NULL？ 空文字？

空文字はINT型の値として無効ですよね？デフォルト値かNULLかに関しては、NULL許容の列ではデフォルトで `DEFAULT NULL`
が指定されたものと考えておけばよいと思います。

**質問2**

[code]

    INSERT INTO t (a) VALUES ();
    
[/code]

カラムリストに指定したカラム全てに値を明示する必要があるため、エラーになります。デフォルト値を挿入させたい場合はそのカラムを省略するか、値の代わりに
`DEFAULT` を指定するか、どちらかです。

カラムリストを省略すると全てのカラムを指定したものとして扱われますが、値リストが空の場合に限り、カラムリストも空として扱われるようです。

[code]

    CREATE TABLE test (a INT, b INT);
    
    INSERT INTO test (a,b) VALUES (1,2); -- OK
    INSERT INTO test (a,b) VALUES (1  ); -- NG
    INSERT INTO test (a,b) VALUES (   ); -- NG
    
    INSERT INTO test (   ) VALUES (   ); -- OK
    
    INSERT INTO test       VALUES (1,2); -- OK
    INSERT INTO test       VALUES (1  ); -- NG
    INSERT INTO test       VALUES (   ); -- OK
    
[/code]

**質問3・4**

`DEFAULT`
は標準SQLで規定されたキーワードで、INSERT文やUPDATE文などの中でのみ使用できます。そのため[INSERTの説明](http://dev.mysql.com/doc/refman/5.6/ja/insert.html)や[UPDATEの説明](http://dev.mysql.com/doc/refman/5.6/ja/update.html)に書かれています。

一方 `DEFAULT(col)`
はMySQLの独自拡張です。他の列のデフォルト値を取得することができるほか、普通の関数なのでSELECT文の中でも使えます。

そのような機能が必要ないのであれば、互換性が高くタイプ数も少ない `DEFAULT` で十分でしょう。


CC BY-SA 3.0
2016-02-17T11:52:09.773
22212
2016-02-17T11:52:09.773
8000
22203
answer