MySQL(第4編)—データの整合性制約(1)(エンティティ整合性、ドメイン整合性)
90210 ワード
データの整合性制約
データの整合性制約(2)(インデックス、参照整合性)をクリックしてください.
一、実体整合性
エンティティ整合性リレーションシップ内のレコードを制約し、ローを制約します.
1、主キー制約
プライマリ・キーは、一意の識別テーブルのレコードに使用されます.プライマリ・キーの値は、テーブル内の各ローを一意に識別できます.1つのテーブルに1つのプライマリ・キー制約しかありません.列はnullにできません
(1).プライマリ・キー制約の追加
作成したテーブルにプライマリ・キー制約を追加
例
まずdesc文を使用してテーブル構造を確認します
以上のようにidフィールドにはkey値がありません.次にstuテーブルにプライマリ・キー制約を設定し、id列をプライマリ・キーに設定します.
以上の結果は、プライマリ・キーの追加が完了したことを証明し、再確認します.
idフィールドのkey値はPRIであり、プライマリ・キーを表す
テーブルの作成時にプライマリ・キー制約を追加
例:studentテーブルを作成するときにstudentテーブルにプライマリ・キー制約を追加し、id列をプライマリ・キーに設定する
desc文を使用して表示
プライマリ・キーの追加に成功しました
(2)プライマリ・キー制約の削除
例:studentテーブルのプライマリ・キー制約を削除する
desc文を使用して、studentテーブルのプライマリ・キー制約が正常に削除されたことを確認します.
(3)新たに挿入したデータのプライマリ・キー繰返しとプライマリ・キー値nullのエラー
新しい挿入データのプライマリ・キーの繰り返し
さっきstuテーブルにプライマリ・キー制約を追加しましたが、次のようにします.
まずstuテーブルのデータを見てみましょう
idが1のデータを再挿入してみます
以上のように、挿入に失敗した場合、新しい挿入データのプライマリ・キーは1を2に繰り返すことができず、再度挿入を試みる
select文を使用してデータを表示すると、id値が重複しない場合に正常に挿入されます.
プライマリキー値null
idがnullのデータを挿入しようとします
プライマリ・キーとして定義されたフィールド値はnullではありません.
2、一意拘束
一意制約データテーブルのフィールド値が一意であることを保証するために使用されます.
(1)一意制約の追加
作成したデータテーブルに一意の制約を追加
例
nameフィールドに一意の制約を追加
desc文を使用して表示すると、nameフィールドのkey値はUNIであり、一意の制約を表します.
データ・テーブルの作成時に一意の制約を追加するには
例:student 2テーブルを作成してフィールドnameに一意性制約を設定する
desc文を使用して表示
(2)重複データの追加エラー
次のように、nameフィールドに一意性制約が設定されます.
まずstudentテーブル内のデータを見てみましょう
xiaobaiという名前のデータを再追加してみます
挿入エラーは、一意性制約が機能していることを示し、「xiaobai」を「xiaobaibai」に変更し、再試行します.
挿入に成功しました
(3)一意制約の削除
例:studentテーブルnameフィールドの一意性制約を削除する
ちょっと見て
3、自動成長列自動成長列を追加するには、自動成長列がプライマリ・キーの一部であることに注意してください.
作成したデータテーブルに追加
構文フォーマット
studentテーブルidフィールドを自動成長列に設定
設定後、確認
挿入データの変更
まず、新しいデータが挿入されていないときのテーブルデータを見てみましょう.
新しいデータを挿入
調べてみると、idは自動的に数値4を生産しています.
データテーブルの作成時に追加
idフィールドの値を自動的に増加させるテーブルstudent 3を作成する
desc文を使用して次のように表示します. 自動成長列を削除する(実際には修正されており、構文フォーマットを見てもわかる) 構文フォーマット
例:テーブルstudent 3のidフィールドの自動成長を削除する
次のように変更されました.
二、ドメイン整合性
ドメイン整合性は、リレーショナル内のセルを制約し、ドメインはセル、すなわち列の制約を表します.
1、空でない拘束
データ・テーブルのフィールドの値がnullでないことを保証します.
(1)空でない制約の追加
作成済みテーブルに追加
例テーブルstudent 3のageフィールドに空でない制約を追加するには、まず、ageフィールドのnull値がYESと表示されることを確認します.
テーブルstudent 3のageフィールドに空でない制約を追加
再度、ageフィールドのnull値がNOと表示されます
以上の結果、ageフィールドを表す空でない制約の追加に成功しました.
テーブルの作成時に追加
また、ageフィールドのnull値がNOと表示され、追加に成功しました
(2)空でない制約の削除(修正)
2、デフォルトの制約
デフォルト制約データテーブルのフィールドにデフォルト値を追加する場合
テーブルの作成時にデフォルトの制約を追加
例
作成されたテーブルにデフォルトの制約を追加
表student 3のsexフィールドのデフォルト値「nv」を設定します.
次のように、デフォルトのコンストレイントの追加に成功しました.
3、データ型
データ型による制約(1)数値型(2)文字列型(3)日付や時間型など
4、CHECK検査制約
MySQLのすべてのストレージエンジンはCHECK制約をサポートしていません.MySQLではCHECK制約を書くことができますが、MySQLはCHECK制約を無視するため、CHECKは機能しません.
データの整合性制約(2)(インデックス、参照整合性)をクリックしてください.
データの整合性制約(2)(インデックス、参照整合性)をクリックしてください.
一、実体整合性
エンティティ整合性リレーションシップ内のレコードを制約し、ローを制約します.
1、主キー制約
プライマリ・キーは、一意の識別テーブルのレコードに使用されます.プライマリ・キーの値は、テーブル内の各ローを一意に識別できます.1つのテーブルに1つのプライマリ・キー制約しかありません.列はnullにできません
(1).プライマリ・キー制約の追加
作成したテーブルにプライマリ・キー制約を追加
alter table add primary key( );
例
まずdesc文を使用してテーブル構造を確認します
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
以上のようにidフィールドにはkey値がありません.次にstuテーブルにプライマリ・キー制約を設定し、id列をプライマリ・キーに設定します.
mysql> alter table stu add primary key(id);
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
以上の結果は、プライマリ・キーの追加が完了したことを証明し、再確認します.
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
idフィールドのkey値はPRIであり、プライマリ・キーを表す
テーブルの作成時にプライマリ・キー制約を追加
create table ( primary key,... );
例:studentテーブルを作成するときにstudentテーブルにプライマリ・キー制約を追加し、id列をプライマリ・キーに設定する
mysql> create table student (
-> id int primary key,
-> name varchar(50),
-> age int,
-> sex varchar(50)
-> );
Query OK, 0 rows affected (0.03 sec)
desc文を使用して表示
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
プライマリ・キーの追加に成功しました
(2)プライマリ・キー制約の削除
alter table drop primary key;
例:studentテーブルのプライマリ・キー制約を削除する
mysql> alter table student drop primary key;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
desc文を使用して、studentテーブルのプライマリ・キー制約が正常に削除されたことを確認します.
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(3)新たに挿入したデータのプライマリ・キー繰返しとプライマリ・キー値nullのエラー
新しい挿入データのプライマリ・キーの繰り返し
さっきstuテーブルにプライマリ・キー制約を追加しましたが、次のようにします.
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
まずstuテーブルのデータを見てみましょう
mysql> select * from stu;
+----+----------+------+------+
| id | name | age | sex |
+----+----------+------+------+
| 1 | xiaohong | 18 | nv |
+----+----------+------+------+
1 row in set (0.00 sec)
idが1のデータを再挿入してみます
mysql> insert into stu values (1,'xiaolan',19,'nv');
ERROR 1062 (23000): Duplicate entry '1' for key 'stu.PRIMARY'
以上のように、挿入に失敗した場合、新しい挿入データのプライマリ・キーは1を2に繰り返すことができず、再度挿入を試みる
mysql> insert into stu values (2,'xiaolan',19,'nv');
Query OK, 1 row affected (0.00 sec)
select文を使用してデータを表示すると、id値が重複しない場合に正常に挿入されます.
mysql> select * from stu;
+----+----------+------+------+
| id | name | age | sex |
+----+----------+------+------+
| 1 | xiaohong | 18 | nv |
| 2 | xiaolan | 19 | nv |
+----+----------+------+------+
2 rows in set (0.00 sec)
プライマリキー値null
idがnullのデータを挿入しようとします
mysql> insert into stu values (null,'xiaomin',19,'nv');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into stu values (NULL,'xiaomin',19,'nv');
ERROR 1048 (23000): Column 'id' cannot be null
プライマリ・キーとして定義されたフィールド値はnullではありません.
2、一意拘束
一意制約データテーブルのフィールド値が一意であることを保証するために使用されます.
(1)一意制約の追加
作成したデータテーブルに一意の制約を追加
alter table add unique( );
例
nameフィールドに一意の制約を追加
mysql> alter table student add unique(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
desc文を使用して表示すると、nameフィールドのkey値はUNIであり、一意の制約を表します.
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | UNI | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
データ・テーブルの作成時に一意の制約を追加するには
create table ( unique,...);
例:student 2テーブルを作成してフィールドnameに一意性制約を設定する
mysql> create table student2 (
-> id int,
-> name varchar(50) unique,
-> age int,
-> sex varchar(50)
-> );
Query OK, 0 rows affected (0.02 sec)
desc文を使用して表示
mysql> desc student2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | UNI | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(2)重複データの追加エラー
次のように、nameフィールドに一意性制約が設定されます.
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | UNI | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
まずstudentテーブル内のデータを見てみましょう
mysql> select * from student;
+----+----------+------+------+
| id | name | age | sex |
+----+----------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
+----+----------+------+------+
2 rows in set (0.00 sec)
xiaobaiという名前のデータを再追加してみます
mysql> insert into student values (3,'xiaobai',19,'nan');
ERROR 1062 (23000): Duplicate entry 'xiaobai' for key 'student.name'
挿入エラーは、一意性制約が機能していることを示し、「xiaobai」を「xiaobaibai」に変更し、再試行します.
mysql> insert into student values (3,'xiaobaibai',19,'nan');
Query OK, 1 row affected (0.00 sec)
挿入に成功しました
mysql> select * from student;
+----+------------+------+------+
| id | name | age | sex |
+----+------------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
| 3 | xiaobaibai | 19 | nan |
+----+------------+------+------+
3 rows in set (0.00 sec)
(3)一意制約の削除
alter table drop index ;
例:studentテーブルnameフィールドの一意性制約を削除する
mysql> alter table student drop index name;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
ちょっと見て
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
3、自動成長列
作成したデータテーブルに追加
構文フォーマット
alter table modify primary key auto_increment;
studentテーブルidフィールドを自動成長列に設定
mysql> alter table student modify id int primary key auto_increment;
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
設定後、確認
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
挿入データの変更
まず、新しいデータが挿入されていないときのテーブルデータを見てみましょう.
mysql> select * from student;
+----+------------+------+------+
| id | name | age | sex |
+----+------------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
| 3 | xiaobaibai | 19 | nan |
+----+------------+------+------+
3 rows in set (0.00 sec)
新しいデータを挿入
mysql> insert into student (name,age,sex) values ('xiaohua',17,'nan');
Query OK, 1 row affected (0.00 sec)
調べてみると、idは自動的に数値4を生産しています.
mysql> select * from student;
+----+------------+------+------+
| id | name | age | sex |
+----+------------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
| 3 | xiaobaibai | 19 | nan |
| 4 | xiaohua | 17 | nan |
+----+------------+------+------+
4 rows in set (0.00 sec)
データテーブルの作成時に追加
create table ( auto_increment,...);
idフィールドの値を自動的に増加させるテーブルstudent 3を作成する
mysql> create table student3(
->id int primary key auto_increment,
->name varchar(50),
->age int,sex varchar(20)
->);
Query OK, 0 rows affected (0.03 sec)
desc文を使用して次のように表示します.
mysql> desc student3;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
alter table modify ;
例:テーブルstudent 3のidフィールドの自動成長を削除する
mysql> alter table student3 modify id int;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
次のように変更されました.
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
二、ドメイン整合性
ドメイン整合性は、リレーショナル内のセルを制約し、ドメインはセル、すなわち列の制約を表します.
1、空でない拘束
データ・テーブルのフィールドの値がnullでないことを保証します.
(1)空でない制約の追加
作成済みテーブルに追加
alter table modify not null;
例テーブルstudent 3のageフィールドに空でない制約を追加するには、まず、ageフィールドのnull値がYESと表示されることを確認します.
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
テーブルstudent 3のageフィールドに空でない制約を追加
mysql> alter table student3 modify age int not null;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
再度、ageフィールドのnull値がNOと表示されます
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | NO | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
以上の結果、ageフィールドを表す空でない制約の追加に成功しました.
テーブルの作成時に追加
create table ( not null,...);
mysql> create table student4 (
-> id int,
-> name varchar(50),
-> age int not null,
-> sex varchar(20)
-> );
Query OK, 0 rows affected (0.03 sec)
また、ageフィールドのnull値がNOと表示され、追加に成功しました
mysql> desc student4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | NO | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(2)空でない制約の削除(修正)
alter table modify ;
2、デフォルトの制約
デフォルト制約データテーブルのフィールドにデフォルト値を追加する場合
テーブルの作成時にデフォルトの制約を追加
create table ( default ,...);
例
mysql> create table student5(
-> id int,
-> name varchar(50),
-> age int,
-> sex varchar(20) default 'nv'
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> desc student5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | nv | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
作成されたテーブルにデフォルトの制約を追加
alter table modify default ;
表student 3のsexフィールドのデフォルト値「nv」を設定します.
mysql> alter table student3 modify sex varchar(20) default 'nv';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
次のように、デフォルトのコンストレイントの追加に成功しました.
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | nv | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
3、データ型
データ型による制約(1)数値型(2)文字列型(3)日付や時間型など
4、CHECK検査制約
MySQLのすべてのストレージエンジンはCHECK制約をサポートしていません.MySQLではCHECK制約を書くことができますが、MySQLはCHECK制約を無視するため、CHECKは機能しません.
データの整合性制約(2)(インデックス、参照整合性)をクリックしてください.