制約
データ入力の制限
CREATE TABLE 文の列定義を行うとき、データ型の直後に NOT NULL を指定できました
NOT NULL はこの列に対して NULL 値を指定することができないことを表しますが
このように、表のデータを制限する機能を制約と呼びます
制約は、NULL の制約以外にもいくつか存在し、データベースの設計に重要です
例えば、特定の範囲の値以外は入力できないように制約することができます
制約は CREATE TABLE 文の列定義で指定することができます
以前は簡単に CREATE TABLE 文を紹介しましたが、SQL99 では次のように定義されています
CREATE [
GLOBAL TEMPORARY | LOCAL TEMPORARY
] TABLE テーブル名 [
ON COMMIT {
PRESERVE ROWS | DELETE ROWS
}
(
列名 データ型 [列制約] [, ...n] |
[LIKE テーブル名] | [テーブル制約] [, ... n]
)
]
TEMPORARY や COMMIT については、この場で知る必要はありません
重要なのは、データ型の後に指定する列制約と、定義の末尾に指定する表制約です
名前のとおり、列制約は列に対して、表制約は複数の列にかかります
NOT NULL は NULL を指定できないことを表すひとつの制約です
NOT NULL 制約は、確かに列のデータ型の直後に指定していましたね
UNIQUE 制約
ひとつのテーブルの中で、同じ値や名前が重複してはならないデータが存在します
管理コードなど、常に一意なデータはデータベースの設計に必要不可欠です
このようなデータを管理する列には UNIQUE 制約を指定します
UNIQUE 制約は、列の値がテーブルの中で一意であることを保障します
そのため、他の行と同じ値が設定された場合、データベースはこれを拒否します
CREATE TABLE Leader (
Name CHAR(255) NOT NULL ,
Party CHAR(255) UNIQUE
)
INSERT Leader VALUES('小泉純一郎' , '自由民主党')
INSERT Leader VALUES('菅直人' , '民主党')
INSERT Leader VALUES('小沢一郎' , '民主党')
mysql> CREATE TABLE Leader (
-> Name CHAR(255) NOT NULL ,
-> Party CHAR(255) UNIQUE
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT Leader VALUES('小泉純一郎' , '自由民主党');
Query OK, 1 row affected (0.02 sec)
mysql> INSERT Leader VALUES('菅直人' , '民主党');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT Leader VALUES('小沢一郎' , '民主党');
ERROR 1062: Duplicate entry '民主党' for key 1
この一連の文は、政治政党の党首を表で表す Leader テーブルを作成しています
当然、政党の党首は一人ですから、同じ政党の名前を入れることはできません
そこで、政党の名前を入力する列 Party に UNIQUE 制約を追加しています
実行結果は MySQL で実行した一例です
最後の「小沢一郎」の行を追加するとき、政党を民主党に指定しています
しかし、この時点ではすでに「菅直人」が民主党として登録されているため
政党の名前が衝突し、データベースは重複によるエラーを通知しています
PRIMARY KEY 制約
データベースの設計では、主キーという概念が存在します
主キーとは表の各行を識別するためのデータで、常に一意の値です
例えば、通信販売などで商品番号や受付番号という言葉を聞いたことがあるはずです
これが、商品や受付のデータを一意に識別する主キーなのです
主キーの条件は、NULL ではななく一意である値です
これは UNIQUE 制約と NOT NULL 制約の組み合わせを意味しています
この主キーに対する制約は PRIMARY KEY 制約を指定します
CREATE TABLE Staff (
Code INT PRIMARY KEY ,
Name CHAR(255) ,
Blood CHAR(2) ,
Height INT ,
Weight INT
);
この文は、社員を管理する表 Staff をデータベースに追加しています
Code は社員番号を表しているため主キーであると考えられるため
PRIMARY KEY 制約を指定して常に一意であることを保障しています
行を追加するときに、Code 列に NULL や他の行で定義されている番号を追加すると
データベースが制約に基づいてこれを拒否するでしょう
主キーの存在はデータベースの設計において重要な存在なのです
表制約