MySQLはゼロから7-テーブル制約のプライマリ・キー、自己成長、ユニーク・キー


テーブル制約には、空の属性、デフォルト値、記述子、およびゼロ充填(空の属性、デフォルト値default、カラム記述comment、ゼロ充填zerofill)のほか、プライマリ・キー、自己成長、一意キーなどのフィールドに対するインデックスおよび拡張制約があります.
1.プライマリ・キー
 primary keyを使用してプライマリ・キーの定義を行います.
 プライマリ・キーは、フィールド内のデータを一意に制約するために使用されます.プライマリ・キー制約のフィールドは空ではなく、繰り返してはいけません.1つのテーブルには最大1つのプライマリ・キーしかありませんが、この制限を突破するために複合プライマリ・キーを定義できます.
--   name     
mysql> create table t1(id int primary key, name varchar(32));
Query OK, 0 rows affected (0.28 sec)

mysql> insert into t1 values(1, 'xucc');
Query OK, 1 row affected (0.07 sec)

--         
mysql> insert into t1 values(1, 'licc');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

--         
mysql> insert into t1(name) values('licc');
ERROR 1364 (HY000): Field 'id' doesn't have a default value

 このようなプライマリ・キーを定義する方法に加えて、2つの方法がある.
--    ,           
mysql> create table t2(id int, name varchar(32), primary key(id));
Query OK, 0 rows affected (0.24 sec)

mysql> create table t3(id int, name varchar(32));
Query OK, 0 rows affected (0.28 sec)

--    ,    
mysql> alter table t3 add primary key(id);
Query OK, 0 rows affected (0.52 sec)
Records: 0  Duplicates: 0  Warnings: 0


mysql> desc t2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(32) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc t3;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(32) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

 プライマリ・キーを定義したフィールドは、テーブル構造内のキーフィールドがPRIであり、テーブル構造キーフィールドはテーブルのインデックスを表し、プライマリ・キーはインデックスの一種であることがわかります.
 複合プライマリ・キーも定義できます.方法は次のとおりです.
mysql> create table t4(id int, name varchar(32), age int, primary key(name, id));
Query OK, 0 rows affected (0.30 sec)

mysql> desc t4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(32) | NO   | PRI | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

 複合プライマリ・キーは、複数のフィールドがプライマリ・キーとして定義されているように見えますが、実質的には、これらのフィールドを使用して行の一意性を共通に決定します.
 dropを使用して、テーブル内のプライマリ・キーを削除します.
mysql> alter table t4 drop primary key;
Query OK, 0 rows affected (0.79 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(32) | NO   |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

2.自己成長
 auto_incrementは、フィールドの自己成長を定義するために使用されます.
自己成長フィールドに値を挿入する必要はありません.自己成長テーブルを変更するたびに、MySQLは自動的に自己成長フィールドに1を追加します.
 自己成長を定義するフィールドは、通常、プライマリ・キー・フィールドと組み合わせて使用されるインデックスである必要があります.したがって、自己成長は論理プライマリ・キーとも呼ばれます.
 自己成長フィールドは整数でなければならず、1枚のテーブルには1つの自己成長フィールドしかありません.自己成長はkeyと組み合わせられているため、現在key学はプライマリ・キーであり、プライマリ・キーは1つしかないので、自己成長も1つしかありません.
mysql> create table t5(id int primary key auto_increment, name varchar(32));
Query OK, 0 rows affected (0.39 sec)

mysql> insert into t5(name) values('zhangsan');
Query OK, 1 row affected (0.07 sec)

mysql> insert into t5(name) values('lisi');
Query OK, 1 row affected (0.06 sec)

mysql> insert into t5(name) values('wangwu');
Query OK, 1 row affected (0.05 sec)

mysql> select * from t5;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
|  3 | wangwu   |
+----+----------+
3 rows in set (0.00 sec)

 自己成長は増加するだけで、自己成長フィールドのデータが削除されても、次のテーブルの変更時に元の値から増加し続けます.
--         id  
mysql> alter table t5 drop id;
Query OK, 3 rows affected (0.68 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t5;
+----------+
| name     |
+----------+
| zhangsan |
| lisi     |
| wangwu   |
+----------+
3 rows in set (0.00 sec)


--      id  
mysql> alter table t5 add id int primary key auto_increment;
Query OK, 0 rows affected (0.55 sec)
Records: 0  Duplicates: 0  Warnings: 0

--       
mysql> insert into t5(name) values('xucc');
Query OK, 1 row affected (0.09 sec)

mysql> select * from t5;
+----------+----+
| name     | id |
+----------+----+
| zhangsan |  1 |
| lisi     |  2 |
| wangwu   |  3 |
| xucc     |  4 |
+----------+----+
4 rows in set (0.00 sec)


mysql> desc t5;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| name  | varchar(32) | YES  |     | NULL    |                |
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

 表構造から,自己成長はExtra拡張フィールドの一種であることが分かる.
3.一意キー
 唯一のキーは、テーブル内の複数のフィールドに一意性制約が必要な問題を解決します.
 唯一のキーの本質とプライマリ・キーの差は多くなく、一意のキー制約のフィールドは空であり、複数が空であり、空のフィールドは一意性の比較を行わないことができる.
 唯一のキー定義方式は,主キーと同様に対応する3つの方式もある.
--              
mysql> create table t6(num int unique);
Query OK, 0 rows affected (0.39 sec)

mysql> insert into t6 values(1);
Query OK, 1 row affected (0.06 sec)

--       
mysql> insert into t6 values(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'num'

--        
mysql> insert into t6 values(null);
Query OK, 1 row affected (0.08 sec)

mysql> desc t6;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| num   | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

 テーブル構造から、一意のキーもインデックスの1つであることがわかります.