MW211 EXIT

devlog
ExcelVBA/ADODBの列未指定≠INSERT文の列未指定
2018年08月06日
SQL文のDEFAULT定義は、あくまで列が指定されなかった場合の既定値であり
NULLを代入した場合の代替値ではないことに注意。
○INSERT文にて列が指定されなかった場合には基本的にNULLが代入される
○この場合、DEFAULT定義があった場合にはその値が代入される
○UPDATE文にてNULLを代入しても、DEFAULT定義の値は無視される
×INSERT文にてNULLを代入したら、DEFAULT定義の値が代入される
  →NULLが代入される

よって、NOT NULL制約とDEFAULT定義が両方定義してある列について
DEFAULT定義があるから(NOT NULL制約にはひっかからなくて)安心というのは間違いだ。

そして、それが如実に現れるのがExcelVBAのADODB。

「テーブル.AddNew」した瞬間に、全ての列にNULLがセットされるので
「テーブル.Fields(列).Value = 値」で値を代入しないと
NULLが代入されることになる。(列が指定されないのではない)

例えば、「列2」に対する代入処理がない場合は、以下のような扱いになる訳だ。
┌─┬────────────────────────────────────┐
│×│INSERT 表 (列1)      VALUES (値2);                                      │
├─┼────────────────────────────────────┤
│○│INSERT 表 (列1, 列2) VALUES (値1, NULL);                                │
└─┴────────────────────────────────────┘
分類:ExcelVBA