MySQL(第4編)—データの整合性制約(1)(エンティティ整合性、ドメイン整合性)

90210 ワード

データの整合性制約
データの整合性制約(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)(インデックス、参照整合性)をクリックしてください.