mysql数据库 主键
mysql数据库 主键 键值 设置自增长主键(primary key)又称主码,用于唯一标识表中的每一条记录可以定义表中的一列或多列为主键,主键列上不能有相同的两行值,也不能为空值。定义authors表,该表给每一个作者分配一个”作者标号“,改编号作为数据表的主键,如果出现相同的值,将提示错误,系统不能确定查询的究竟是哪一条记录。如果把作者的姓名作为主键,则不能出现重复的名字,这与现实不符,因此姓
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)

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