NULL禁止。
成果物
not null
0_0.sql
create table T(A int not null);
テーブル作成できた。
違反
0_1.sql
create table T(A int not null); insert into T values(NULL);
Error: near line 2: NOT NULL constraint failed: T.A
integer primary key not nullでNULLをセットしてもエラーにならずrowid+1になる
1_0.sql
create table T(A integer primary key not null, B text); insert into T(B) values('A'); insert into T(A,B) values(NULL,'B'); select * from T;
1|A 2|B
え、マジで?
integer primary keyにNULL代入するとrowid+1になる
そもそもnot null制約がなくても、nullを代入したらrowid+1になるらしい。
1_1.sql
create table T(A integer primary key, B text); insert into T(A,B) values(NULL,'A'); .echo on select * from T; select * from T where A is NULL; .echo off
select * from T; 1|A select * from T where A is NULL; .echo off
あれ、こうなるの? NULLが入っちゃうような気がしていたが。勘違いだったか、バージョン更新で変わったか。
nullが入っちゃうのはinteger以外でのprimary keyのときだけ?
not null on conflict ...
使えるようだが省略する。そもそもNULL値など使うべきでない。
だからNULLが代入されたときの対処はデフォルトのエラーだけで十分。
ベストプラクティス
integer primary keyはNULLを代入してもrowid+1になってくれるのでnot null不要(設定しても同様だが短縮できるため不要)integer primary key以外はnot nullにする(NULL撲滅)on conflict ...も使えるがNULL撲滅のためNULLが与えられた時点でエラーにすべきなので不要defaultにて適当な初期値を与える
たとえば以下。
create table users( id integer primary key, age integer not null default 0, name text not null default '', image blob not null default x'' );
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習 俯瞰まとめ
- SQLite3学習 環境構築まとめ
- SQLite3学習 インタフェースまとめ(C言語、CLI、対話モード、Tcl...)
- SQLite3学習 ドットコマンドまとめ
- SQLite3学習 JSON拡張まとめ
- SQLite3学習 FTSまとめ(ICU, MeCab)
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 Geopoly(2次元ベクタ画像の生成)
- SQLite3学習 拡張関数(generate_series)
- SQLite3学習 拡張ライブラリ数学関数(extension-functions.c)
- SQLite3学習 謎と名前
- SQL文の分類(DDL,DML,TCL,DCL)
- SQL構文 alter(rename)
- SQL構文 alter(add column)概要
- SQL構文 alter(add column)制約
- SQL構文 alter(add column)sqlite_master変更しても反映されない
- SQL構文 alter(add column)スキーマ再定義(テーブル再作成による定義変更)
- SQL構文 analyze
- SQL構文 attach/detach
- SQLite3構文 begin,end,commit,rollback,savepoint(deferred,immediate,exclusive)
- SQLite3構文 コメント
- SQLite3構文 create/drop
- SQLite3構文 index(create/drop)
- SQLite3構文 table(create/drop)
- SQLite3構文 列制約(default)
- SQLite3構文 列制約(collate)
- SQLite3構文 列制約(primary key)
- SQLite3構文 列制約(primary key)ベストプラクティス
- SQLite3構文 列制約(unique)