mysql数据库 主键 键值 设置自增长

  • 主键(primary key)又称主码,用于唯一标识表中的每一条记录
  • 可以定义表中的一列或多列为主键,主键列上不能有相同的两行值,也不能为空值。

定义authors表,该表给每一个作者分配一个”作者标号“,改编号作为数据表的主键,如果出现相同的值,将提示错误,系统不能确定查询的究竟是哪一条记录。如果把作者的姓名作为主键,则不能出现重复的名字,这与现实不符,因此姓名字段不适合作为主键。

1. 使用主键约束

  • 主键约束(primary key constraint)要求主键列的数据唯一,并且不允许为空。
  • 主键能够唯一的标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度,
  • 主键和记录之间的关系,如同身份证和人之间的关系,他们之间是一一对应的
  • 主键分为两种类型
    • 单字段主键
    • 多字段联合主键
  • 注意事项:
    •    一个表中只能有一个primary key字段
      
    •    对应的字段值不能重复且不能为NULL
      
    •    如果由多个字段都作为primary key,称为复合主键,必须一起创建
      
    •    主键字段的key标志是PRI
      
    •    通常与auto_increment连用
      
    •    经常把表中能够唯一标识的字段作为主键(记录编号字段)
      

1.1 单字段主键

单字段主键由一个字段组成,SQL语句格式分为以下两种情况

(1)在定义列的同时指定主键,语法:

字段名 数据类型 PRIMARY KEY [默认值]

Example:

  • 定义数据表tb_emp2,其主键为id,SQL语句如下:

    mysql> create table tb_emp2(
        -> id int(11) primary key,
        -> name varchar(25),
        -> deptid int(11),
        -> salary float
        -> );
    
    
  • 定义数据表tb_emp3,其主键为id,SQL语句如下:

    mysql> create table tb_emp3(
        -> id int(11),
        -> name varchar(25),
        -> deotid int(11),
        -> salary float,
        -> primary key(id)
        -> );
    
    
  • 查看表结构

    mysql> desc tb_emp3;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | NO   | PRI | NULL    |       |
    | name   | varchar(25) | YES  |     | NULL    |       |
    | deotid | int(11)     | YES  |     | NULL    |       |
    | salary | float       | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    
    

1.2 多字段联合主键

主键由多个字段组成,语法:

primary key [字段1,字段2,字段N]

Example:

定义数据表tb_emp4,假设表中间没有主键id,为了唯一确定一个员工,可以把name、deptid联合起来作为主键,SQL语句如下:

mysql> create table tb_emp4(
    -> name varchar(25),
    -> deptid int(11),
    -> salary float,
    -> primary key(name,deptid)
    -> );

mysql> desc tb_emp4;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(25) | NO   | PRI | NULL    |       |
| deptid | int(11)     | NO   | PRI | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

1.3 移除主键

  • 在已有的表中移除主键

    移除主键之前,如果由自增属性,必须先去掉

  • 语法:

    alter table 表名 drop primary key;

1.3.1 移除单字段主键
mysql> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

mysql> alter table tb_emp2 drop primary key;

mysql> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+


1.3.2 移除多字段(复合/联合主键)

与移除单字段主键一致

表中有复合主键的时候,不能单独将某一个字段的主键进行移除

1.4 添加主键

  • 语法:

    alter table 表名 add primary key(字段名);

mysql> alter table tb_emp4 add primary key(name,deptid);

mysql> desc tb_emp4;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(25) | NO   | PRI | NULL    |       |
| deptid | int(11)     | NO   | PRI | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

1.5 使用主键配置自增长

创建下表:

mysql> create table tb_emp5(
    -> id int(11) not null auto_increment,
    -> name varchar(11),
    -> deptid int(11) not null,
    -> salary float,
    -> primary key(id)
    -> );

mysql> desc tb_emp5;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(11) | YES  |     | NULL    |                |
| deptid | int(11)     | NO   |     | NULL    |                |
| salary | float       | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+


mysql> insert into tb_emp5(name) values('natasha');
ERROR 1364 (HY000): Field 'deptid' doesn't have a default value #提示deptid字段不能为空
#id字段设置了主键+自增长(可以不用赋值,自增长的)
mysql> desc tb_emp5;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(11) | YES  |     | NULL    |                |
| deptid | int(11)     | NO   |     | NULL    |                |
| salary | float       | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> insert into tb_emp5(name,deptid) values('natasha',2103);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tb_emp5;
+----+---------+--------+--------+
| id | name    | deptid | salary |
+----+---------+--------+--------+
|  1 | tom     |   2101 |  13500 |
|  2 | NULL    |  17688 |   NULL |
|  5 | NULL    |  17688 |   NULL |
|  6 | natasha |   2103 |   NULL |
+----+---------+--------+--------+
4 rows in set (0.00 sec)


Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐