データベーステーブルにおける制約とは、データの正確性と信頼性を確保するためのルールです。MySQL でサポートされる主な制約種類は以下の通りです:
- NOT NULL: フィールド値が空値であることを禁止(例:ユーザー名、ID)
- DEFAULT: フィールドにデフォルト値設定(例:性別)
- PRIMARY KEY: 一意性と非空を保証(例:学生番号)
- UNIQUE: 値の一意性を保証(例:座席番号)
- FOREIGN KEY: 関連テーブル間の参照整合性を保証(例:所属部署ID)
制約追加のタイミング
- テーブル作成時
- テーブル変更時
列レベル制約とテーブルレベル制約
| 種類 |
サポート制約 |
| 列レベル |
全ての制約(外部キーは完全機能せず) |
| テーブルレベル |
非空・デフォルトを除く全て |
主キーとユニーク制約の比較
| 特性 |
主キー |
ユニーク |
| 一意性保証 |
○ |
○ |
| NULL許可 |
× |
○ |
| テーブル内数 |
1つまで |
複数可 |
テーブル作成時の制約定義
列レベル制約の例
CREATE TABLE student_data (
student_id INT PRIMARY KEY,
full_name VARCHAR(30) NOT NULL UNIQUE,
gender CHAR(1) CHECK(gender = 'M' OR gender = 'F'),
seat_number INT UNIQUE,
years INT DEFAULT 18,
department_code INT REFERENCES departments(dept_code)
);
CREATE TABLE departments (
dept_code INT PRIMARY KEY,
dept_name VARCHAR(30)
);
テーブルレベル制約の例
CREATE TABLE student_data (
student_id INT,
full_name VARCHAR(30),
gender CHAR(1),
seat_number INT,
years INT,
department_code INT,
CONSTRAINT pk_main PRIMARY KEY(student_id),
CONSTRAINT uk_seat UNIQUE(seat_number),
CONSTRAINT chk_gender CHECK(gender IN ('M','F')),
CONSTRAINT fk_department FOREIGN KEY(department_code)
REFERENCES departments(dept_code)
);
テーブル変更時の制約操作
制約追加
-- 非空制約追加
ALTER TABLE student_data
MODIFY COLUMN full_name VARCHAR(30) NOT NULL;
-- 外部キー制約追加
ALTER TABLE student_data
ADD CONSTRAINT fk_dept
FOREIGN KEY(department_code)
REFERENCES departments(dept_code);
制約削除
-- 主キー削除
ALTER TABLE student_data DROP PRIMARY KEY;
-- 外部キー削除
ALTER TABLE student_data DROP FOREIGN KEY fk_dept;