primary key 主键

4.1 问题

具体要求如下:

建表时,创建主键
在已有表里添加主键
建表时创建复合主键
删除主键
设置字段值自增长

4.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习主键的使用

1)建表时设置PRIMARY KEY主键索引

Mysql> create  database db2;
mysql> CREATE TABLE db2.biao01(
    -> id int(4) PRIMARY KEY,                      //直接在字段定义时约束
    -> name varchar(8)
    -> );
Query OK, 0 rows affected (0.19 sec)

或者:

mysql> CREATE TABLE db2.biao02(
    -> id int(4),
    -> name varchar(8),
    -> PRIMARY KEY(id)                              //所有字段定义完,最后指定
    -> );
Query OK, 0 rows affected (0.17 sec)

在建表的时候,如果主键字段为int类型,还可以为其设置AUTO_INCREMENT自增属性,这样当添加新的表记录时,此字段的值会自动从1开始逐个增加,无需手动指定。比如,新建一个tea6表,将id列作为自增的主键字段:

mysql> CREATE TABLE db2.tea6(
    -> id int(4) AUTO_INCREMENT,
    -> name varchar(4) NOT NULL,
    -> age int(2) NOT NULL,
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.29 sec)

2)删除现有表的PRIMARY KEY主键索引

如果要移除某个表的PRIMARY KEY约束,需要通过ALTER TABLE指令修改。比如,以下操作将清除biao01表的主键索引。

清除前(主键为id):

mysql> DESC db2.biao01;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(4)     | NO   | PRI | NULL    |       |
| name  | varchar(8) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

清除操作:

mysql> ALTER TABLE db2.biao01 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.49 sec)
Records: 0  Duplicates: 0  Warnings: 0

清除后(无主键):

mysql> DESC db2.biao01;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(4)     | NO   |     | NULL    |       |
| name  | varchar(8) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

当尝试删除tea6表的主键时,会出现异常:

mysql> ALTER TABLE tea6 DROP PRIMARY KEY;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

这是因为tea6表的主键字段id具有AUTO_INCREMNET自增属性,提示这种字段必须作为主键存在,因此若要清除此主键必须先清除自增属性——修改id列的字段定义:

mysql> ALTER TABLE tea6 MODIFY id int(4) NOT NULL;
Query OK, 0 rows affected (0.75 sec)
Records: 0  Duplicates: 0  Warnings: 0

然后再清除主键属性就OK了:

mysql> ALTER TABLE tea6 DROP PRIMARY KEY;                  //清除主键
Query OK, 0 rows affected (0.39 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc tea6;                                         //确认清除结果
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(4)     | NO   |     | NULL    |       |
| name  | varchar(4) | NO   |     | NULL    |       |
| age   | int(2)     | NO   |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

3)为现有表添加PRIMARY KEY主键索引

重新为tea6表指定主键字段,仍然使用id列:

mysql> ALTER TABLE tea6 ADD PRIMARY KEY(id);              //设置主键字段
Query OK, 0 rows affected (0.35 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> DESC tea6;                                          //确认设置结果
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(4)     | NO   | PRI | NULL    |       |
| name  | varchar(4) | NO   |     | NULL    |       |
| age   | int(2)     | NO   |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

4)建表时创建复合主键

mysql>
mysql> create table  db2.t6(
    -> class char(7),
    -> name  char(15),
    -> pay   enum("yes","no") default "no",
    -> primary key(class,name,pay)  //指定多个字段一起做主键
    -> );
Query OK, 0 rows affected (0.04 sec)
mysql> desc db2.t6;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| class | char(7)          | NO   | PRI |         |       |
| name  | char(15)         | NO   | PRI |         |       |
| pay   | enum('yes','no') | NO   | PRI | no      |       |
+-------+------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql>
发布了252 篇原创文章 · 获赞 10 · 访问量 6642

猜你喜欢

转载自blog.csdn.net/weixin_45843450/article/details/105345677