27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]
E-mail:mzze@163.com
Q Q:32362389
W X:xiaomi168527
27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]
大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]
E-mail:97157726@qq.com
Q Q:97157726
主键概念:唯一标识表中的记录的一个或一组列称为主键。
主键(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
本站内容均为小米原创,转载请注明出处:小米技术社区>> mysql主键primary key和联合主键,复合主键,它们的特点,作用和选用原则