MySQLデータ整合性制約


データ整合性とは、データの正確性と適合性を指し、データベースに意味に合わないデータが存在することを防止するため、すなわちデータベースに不正なデータが存在することを防止するためである.MySQLには複数の整合性制約があります.
1、主キー制約
プライマリ・キーは、テーブル内のカラムであってもよいし、テーブル内の複数のカラムからなる組合せであってもよい.ここで、複数の列を組み合わせたプライマリ・キーは、複合プライマリ・キーとも呼ばれる.MySQLでは、プライマリ・キー列は次のルールに従う必要があります.
(1)テーブルごとに1つのプライマリ・キーしか定義できません.
(2)一意性の原則.プライマリ・キーの値は、キー値とも呼ばれ、テーブル内の各レコードを一意に表すことができ、NULLではない必要があります.
(3)最小化ルール.複合プライマリ・キーに不要な余分な列を含めることはできません.すなわち、1つの複合プライマリ・キーから1つのカラムを削除した後も、残りのカラムからなるプライマリ・キーが一意性の原則を満たすことができれば、この複合プライマリ・キーは正しくない.
(4)複合プライマリ・キーのリストには1つのカラム名しか表示されません.
例:学生情報テーブルtb_の作成studentの場合、学号(stu_id)フィールドをプライマリ・キーに設定します.
CREATE TABLE tb_student
(
	stu_id INT AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(30)
);

例:ユーザ情報テーブルtb_の作成studentでは、学号(stu_id)と所在するクラス番号(class_id)フィールドを複合プライマリ・キーに設定します.
CREATE TABLE tb_student
(
	stu_id INT AUTO_INCREMENT,
	name VARCHAR(30),
	class_id INT NOT NULL,
	PRIMARY KEY (stu_id,class_id)
);

例:データテーブル構造を変更して、プライマリ・キー制約を追加します.
ALTER TABLE tb_student ADD CONSTRAINT PRIMARY KEY(stu_id);

2、一意拘束
ユニークコンストレイントはUNIQUEキーを使用して定義されます.ユニークコンストレイントの値はユニークでなければなりません.NULLではありません.
MySQLでは、一意の制約とプライマリ・キーの間に次の2つの違いがあります.
(1)1つのテーブルに1つのプライマリ・キーしか作成できませんが、複数の一意の制約を定義できます.
(2)プライマリ・キー制約を定義するとPRIMARY KEYインデックスが自動的に作成され、候補キー制約を定義するとUNIQUEインデックスが自動的に作成されます.
例:ユーザ情報テーブルtb_の作成studentでは、学号(stu_id)と名前(name)を一意の制約に設定します.
CREATE TABLE tb_student
(
	stu_id INT UNIQUE,
	name VARCHAR(30) UNIQUE
);

例:ユーザ情報テーブルtb_の作成studentでは、学号(stu_id)と名前(name)フィールドを複合一意制約に設定します.
CREATE TABLE tb_student
(
	stu_id INT,
	name VARCHAR(30),
	UNIQUE uniq_id_name (stu_id,name)
);

例:データテーブル構造を変更して、一意の制約を追加します.
ALTER TABLE tb_student ADD CONSTRAINT uniq_id_name UNIQUE(stu_id,name);

3、外部キー制約
MySQLには2つの一般的なエンジンタイプ(MyISAMとInnoDB)があり、現在はInnoDBエンジンタイプのみで外部キー制約をサポートしています.
例:クラス情報テーブル(tb_class)と学生情報テーブル(tb_student)を作成し、学生情報テーブルのクラス番号(class_id)フィールドの外部キー制約を設定します.
--        
CREATE TABLE tb_class
(
	class_id INT AUTO_INCREMENT PRIMARY KEY,
	class_name VARCHAR(30) NOT NULL
);

--        ,     ID     
CREATE TABLE tb_student
(
	stu_id INT AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(30),
	class_id INT NOT NULL,
	FOREIGN KEY fk_class_id (class_id)
	REFERENCES tb_class(class_id)
);

例:データテーブル構造を変更して、外部キー制約を追加します.
ALTER TABLE tb_student ADD CONSTRAINT FOREIGN KEY fk_class_id (class_id) REFERENCES tb_class(class_id);

4、空でない拘束
Null以外の制約は、カラムに値を指定する必要があることを制限します.Null値(NULL)は、数値0でも空文字列でもない、存在しない、未知の値です.
例:学生情報テーブルtb_の作成studentの場合、名前(name)フィールドを空でない制約として追加します.
CREATE TABLE tb_student
(
	stu_id INT AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(30) NOT NULL
);

例:データテーブル構造を変更して、名前(name)フィールドを空でないように変更します.
ALTER TABLE tb_student MODIFY COLUMN name VARCHAR(30) NOT NULL;

5、検査制約
チェックコンストレイントは、カラムに入力された値を制限することによってドメインの整合性を強制するカラムの値の範囲を指定します.
例:学生情報テーブルtb_の作成studentでは、年齢(age)の値を7~18の間(18を除く)に設定します.
CREATE TABLE tb_student
(
	stu_id INT AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(30),
	age INT NOT NULL CHECK(age>=7 AND age<18)
);

注意:現在のMySQLバージョンはCHECK制約の解析処理にすぎませんが、直接無視され、エラーは報告されません.
6、制約の削除
制約構文を削除するには、次の手順に従います.
ALTER TABLE    DROP [FOREIGN KEY| INDEX     ]|[PRIMARY KEY]

例:制約を削除します.
CREATE TABLE tb_student
(
	stu_id INT,
	name VARCHAR(30) ,
	class_id INT NOT NULL,

	--     
	PRIMARY KEY(stu_id),

	--     
	FOREIGN KEY fk_class_id (class_id)
	REFERENCES tb_class(class_id),

	--      
	UNIQUE uniq_name (name)
);

--       
ALTER TABLE tb_student DROP PRIMARY KEY;

--       
ALTER TABLE tb_student DROP FOREIGN KEY fk_class_id;

--        
ALTER TABLE tb_student DROP INDEX uniq_name;