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)