SQLの勉強中ですが、自分の脳内整理や備忘録用に作成。
今回は、テーブルの制約についてアレコレ。
制約
人為的ミスに備える
・DBの本来の役割を考えると、テーブルに異常な値が格納されてしまうことは絶対に避けなければならない。
・以前学習したのは、同時実行や予期せぬ中断など、システム的な理由でデータが異常な状態に避ける用に、TRANSACTIONを学習した。しかし、DB利用者が文法としては正しいが、システムの意図としては誤ったSQL文を送ってしまうような人為的なミスに対しては、トランザクション制御は全くの無力です。
なので、人為的ミスに対する対策を行う。
○あえて制限することで安全性を高める
・予期しない値を格納できないように制限をかけることで、人為的ミスによるデータ破壊の可能性を減らすことができる。
●基本的な3つの制約
・制約は、CREATE TABLE文でテーブルを定義する際、列定義の末尾に指定することが可能。 例:
CREATE TABLE テーブル名(
列名 型 制約の指定 ,
・
・
)
○3つの制約 その①
NOT NULL制約:NOT NULL制約が設定された列には、NULLの格納は許可されない。誤ってINSERTなどを実行すると、エラーが発生し、行の追加に失敗する。
NOT NULL制約はDEFAULT指定と組み合わせて利用されることがほとんど。
○3つの制約 その②
UNIQUE制約:ある列の内容が決して重複してはならない場合、UNIQUE制約をつける。
※UNIQUE制約がかけられていても、NULLが格納された行が複数存在することは許される。なぜなら、「NULLはNULLとも等しくない」からです。
○3つの制約 その③
CHECK制約:ある列に格納される値が妥当であるかを細かく判定したい場合は、CHECK制約を用いる。CHECKの後ろのカッコ内に記述した条件式が真となるような値だけが格納を許される。
●主キー制約
・以前学んだ主キーの列とは、「その列の値を指定すれば、どの1行のことかを完全に特定できる」という役割を与えられた列のこと。要するに、「他の行と重複してはならない」「必ず値が格納されなければならない(NULLであってはならない)」という2つの性質を満たさなければならないことを学んだ。
主キー制約(PRIMARY KEY 制約):主キーの役割を担う列には、主キー制約を付けます。この制約がついている列は、単に「NULLも重複も許されない列」ではなく、主キーとしての役割が期待されているという意味を持ちます。
例)主キー制約の指定①:
CREATE TABLE テーブル名(
列名 型 PRIMARY KEY,
・
・
)
例)主キー制約の指定②:
CREATE TABLE テーブル名(
列名 型,
列名2 型,
・
・
PRIMARY KEY(列名,列名2) ---列名と列名2で複合主キーを構成する。
)
●外部キーと参照整合性
参照整合性の崩壊とは:外部キーで別テーブルの行を参照しているのに、その行が存在しない状態をいう。このような状況になることは絶対に避けなければならない。
○参照整合性崩壊を引き起こす4つのデータ操作
①「他の行から参照されている」行を削除してしまう。
②「他の行から参照されている」行の主キーを変更してしまう。
③「存在しない行を参照する」行を追加してしまう。
④「存在しない行を参照する」行に更新してしまう。
●外部キー制約
参照整合性が崩れるようなデータ操作をしようとした場合に、エラーを発生させ強制的に処理を中断させる制約が外部キー制約(FOREIGN KEY制約)です。この制約は、参照元のテーブルの外部キー列に設定する。
例)外部キー制約の指定①:
CREATE TABLE テーブル名(
列名 型 REFERENCES 参照先テーブル名(参照先列名)
・
・
)
例)外部キー制約の指定②:
CREATE TABLE テーブル名(
・
・
FOREIGN KEY(参照元列名) REFERENCES 参照先テーブル名(参照先列名)
)