MySQL从零开始 7-表约束之主键,自增长,唯一键

 表约束除了空属性,默认值,描述符以及零填充外(空属性,默认值default,列描述comment以及零填充zerofill),还有主键,自增长,唯一键等对字段的索引和扩展约束。

1. 主键

 使用 primary key 进行主键的定义。

 主键用于唯一的约束该字段里的数据,主键约束的字段不能为空,不能重复,一张表里最多只能有一个主键,但是可以定义复合主键来突破这个限制。

-- 设置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

 除了这种定义主键的方式外,还有两种方式。

-- 方式二,在字段列表之后定义主键
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)

 我们可以看到,定义了主键的字段在表结构里Key字段为PRI,表结构Key字段表示的是表的索引,主键是索引的一种。

 还可以定义复合主键,方法如下:

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。

 定义自增长的字段必须要是一个索引,例如通常与主键字段搭配使用,所以自增长又称为逻辑主键。

 自增长字段必须是整数,且一张表只能有一个自增长字段,,因为自增长与key搭配,目前key学的是主键,主键只有一个,所以自增长也只有一个。

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. 唯一键

 唯一键可以解决表中有多个字段需要唯一性约束的问题。

 唯一键的本质和主键差不多,唯一键约束的字段允许为空,而且可以多个为空,空字段不做唯一性比较。

 唯一键定义方式和主键一样,也有对应的三种方式。

-- 创建一个拥有唯一键字段的表
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)

 从表结构中我们可以看出,唯一键也是索引的一种。

猜你喜欢

转载自blog.csdn.net/weixin_40739833/article/details/80635025