Python
Flask
SQL
python3

【Flaskチュートリアル】テーブル作成時の制約をまとめた。

なんのために共有するか?

sqlite3でテーブルを作成するときのポイントをまとめました。
(知っておくと他のSQLでも応用できるはず。)

flaskのチュートリアルとして作成する
flaskrのデータベースとそのテーブル構成は下記のようになっている。
その中から学習しよう。
下記に制約の解説があるので、
まずはこんな感じになっているとさーっと読み飛ばせばOK。

CREATE TABLE テーブル名でテーブルを作成。
flaskではuserテーブルとpostテーブルを取り扱う。

schema.sql
-- Initialize the database.
-- Drop any existing data and create empty tables.

DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);

PRIMARY KEY制約

カラムにPRIMARY KEY制約を設定した場合、
そのカラムは主キーになる。
だいたいテーブル内のidはPRIMARY KEY制約を持ってる。
flaskチュートリアルでも重要なところだけpick upするとこんな感じ。

schema.sql
CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
(省略)
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
(省略)
);

UNIQUE制約

カラムに格納する値として
既に格納されているデータの値とかぶった値では登録できないようにする場合、
カラムにUNIQUE制約を設定する。
例えばusernameがかぶるのはダメよと。

schema.sql
  username TEXT UNIQUE NOT NULL,

NOT NULL制約

NOT NULL制約を設定すると、
NULLを格納することができなくなる。
逆にいうと、なんかしらの値があれば格納することができるってこと。
例えば、パスワードはなしはさすがにまずいよねって意味ならこう。

schema.sql
(省略)
  password TEXT NOT NULL
(省略)

DEFAULT制約

値をテーブルに追加するときに、
timestampはDEFAULTで記述すると便利。

schema.sql
(省略)
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
(省略)

外部キー(FOREIGN KEY)

他の行と比べると、ちょっと癖のある書き方。
だけどすぐ理解できるから安心を。

idはuserテーブルのPRIMARY KEYになっている。
でそれをpostテーブルの中ではauthor_idという名前で使いたい
ということだ。

こうすると、
そもそもuserテーブルに存在しないidをもつデータは、
postテーブルには格納できねーよ?
って仕組み。

schema.sql
  FOREIGN KEY (author_id) REFERENCES user (id)

応用編

CHECK制約

CHECK制約を設定すると、
任意の条件式を指定できます。
例えば0以上の値を設定してほしいときはこう。

schema.sql
(省略)
  test_result integer check(test_result >= 0 and test_result <= 100));
(省略)

最後に

「知りたかったことが知れた!」とか「新しいことが知れた!」
と思ったら左のいいねボタンをポチッとお願いします!

デザインエンジニアのMasaでした!
ではではドロン!!