小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
您的位置:首页 > 后端编程 > 数据库 > mysql

mysql主键primary key和联合主键,复合主键,它们的特点,作用和选用原则

分类: mysql62个赞

主键

主键概念:唯一标识表中的记录的一个或一组列称为主键。

主键(PRIMARY KEY)的完整称呼是“主键约束”


主键特点:

1、主键不能重复、不能为空

2、一个表只能有一个主键,但是一个主键可以有多个字段组成。

3、主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。

4、只要是自动增长auto_increment必须是主键,但是主键不一定是auto_increment

拓展阅读:mysql的自动增长auto_increment;开始值更改,每次自增量更改

主键作用:

1、保证数据完整性(如下图)

2、加快查询速度

主键的作用


选择主键的原则

最少性:尽量选择单个键作为主键

稳定性:尽量选择数值更新少的列作为主键

比如:学号,姓名、地址  这三个字段都不重复,选哪个做主键

选学号,因为学号最稳定


创建主键的二种方法

在 CREATE TABLE 语句中,通过 PRIMARY KEY 关键字来指定主键。

-- 方法1,创建字段的时候直接创建主键
mysql> create table stu20(
    -> id int auto_increment primary key,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.04 sec)
-- 方法2:先创建字段,再添加主键
mysql> create table stu21(
    -> id int auto_increment,
    -> name varchar(20),
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.02 sec)


更改表添加组件

语法:

add primary key(id);

案例:

-- 先创建表
mysql> create table stu23(
    -> id int,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.05 sec)

-- 添加主键
mysql> alter table stu23 add primary key(id);
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0


删除主键

语法:

drop primary key;

案例:

mysql> alter table stu23 drop primary key;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0


复合主键和联合主键

可以统称为组合键

概念:

复合主键是一个表中用两个字段来确定数据唯一性,不单独使用无业务含义的自增id作为主键。为了解决第二个字段可能出现重复数据记录,为了保证数据的唯一性。

联合主键顾名思义就是多个主键联合,体现联合。用两个或多个表中的主键组合起来确定数据唯一性,索引可以极大的提高数据的查询速度,但是会降低,插入,删除,更新表的速度。



所以:联合主键体现在多个表上,复合主键体现在一个表中的多个字段

复合主键就是含有一个以上的字段组成,如ID+name,ID+phone等,而联合主键要同时是两个表的主题组合起来的。这是和复合主键最大的区别!


复合主键

为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。


联合主键的应用场景

实际案例:

比如,设置学生选课数据表时,使用学生编号做主键还是用课程编号做主键呢?如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选。显然,这两种情况都是不符合实际情况的。

实际上设计学生选课表,要限定的是一个学生只能选择同一课程一次。因此,学生编号和课程编号可以放在一起共同作为主键,这也就是复合主键了。


语法:

primary key(组合键1,组合键2)

(1)一个字段名只能在复合主键字段表中出现一次。

(2)复合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。


案例:

mysql> create table stu22(
    -> classname varchar(20),
    -> stuname varchar(20),
    -> primary key(classname,stuname)  -- 创建复合主键
    -> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc stu22;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| classname | varchar(20) | NO   | PRI |         |       |
| stuname   | varchar(20) | NO   | PRI |         |       |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

联合主键

概念:联合主键顾名思义就是多个主键联合造成一个主键组合。 


联合主键的意义:用2个字段(或者多个字段)来肯定一条记录。说明:这2个字段能够都不惟一,即2个字段能够分别重复,这么设置的好处,能够很直观的看到某个重复字段的记录条数。 


案例: 主键A跟主键B组成联合主键 

主键A跟主键B的数据能够彻底相同,联合就在于主键A跟主键B造成的联合主键是惟一的。 

下例主键A数据是1,主键B数据也是1,联合主键实际上是11,11是惟一值,不容许再出现11这个值(即为多对多关系)

主键A数据   主键B数据 

   1      1 

   2      2 

   3      3 

主键A与主键B的联合主键值最多为: 十一、 十二、 1三、 2一、 2二、 2三、 3一、 3二、 33。


主键相关练习:

在主键列输入的数值,允许为空吗?        
不可以
一个表可以有多个主键吗?                
不可以
在一个学校数据库中,如果一个学校内允许重名的学员,但是一个班级内不允许学员重名,可以组合班级和姓名两个字段一起来作为主键吗?                      
对
标识列(自动增长列)允许为字符数据类型吗?   
不允许
一个自动增长列中,插入3行,删除2行,插入3行,删除2行,插入3行,删除2行,再次插入值是多少?  
10




小米技术社区