制限つきだが列を追加できる。
成果物
情報源
制限
SQLite3のalter table
の列操作は他のDBMSに比べると低機能。列の追加に制約があったり、追加以外に変更や削除ができない。
要素/操作 | 追加 | 削除 |
---|---|---|
列 | ○ | ☓ |
制約 | ☓ | ☓ |
変更は名前だけ可。rename
で。制約は不可。
add column
制限
- 付与不可
primary key
,unique
制約default
制約の値にCURRENT_TIME
,CURRENT_DATE
,CURRENT_TIMESTAMP
, 式()
not null
制約があるときnull
以外の値をdefault
に設定する必要があるforeign key references
制約を追加したらdefault
でnull
を設定する必要があるcheck
制約を追加しても既存の行に対してはチェックしない(将来変更される?)
sqlite_master
alter table
はsqlite_master
テーブルのsql
列にあるSQLテキストを変更することで機能する。
このため実行時間はデータ量に依存しない。1行でも1000万行でも同じ。
これって、sqlite_master
のsql
列テキストを変更したら構造も反映されるってことか? alter
構文を使わずとも? 要検証。
後方互換
alter table
を実行すると、SQLite3 3.1.3以前では読み込めなくなる。
他の変更をする方法
正解 | 間違い |
---|---|
|
|
間違った方法でやると以下のリンクが破壊されてしまう。
- 外部制約
- ビュー
- トリガー
他にも細かい手順が書いてあった。要検証。
やってみる
ターミナルで以下コマンド実行。
sqlite3
まずは列を追加するベースとなるテーブルを作る。
create table T(A text);
定義内容を確認する。
select sql from sqlite_master;
CREATE TABLE T(A text)
以下の部分が勝手に変更されているが、まあいい。
create table
が大文字化- 末尾
;
消失
列の追加
alter table T add column B text;
確認。
select sql from sqlite_master;
CREATE TABLE T(A text, B text)
B
列が追加された。
追加された既存レコードの列値はNULL
である
テーブル作成からやり直す。既存レコードを作る。
drop table T; create table T(A text); insert into T values('AAA');
列を追加する。
alter table T add column B text;
既存レコードのうち追加したB
列の値はNULL
である。
.headers on select * from T where B is NULL;
A|B AAA|
空文字列ではない。
select * from T where B = '';
次回
add column
制限の確認sqlite_master
のsql
列テキストを変更したら構造も反映されるか確認- 制限を回避した再作成
対象環境
- 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構文 alter(rename)