概念 :

主关键字(主键,primary key)是被挑选出来,作表的行的惟一标识的候选关键字一个表只有一个主关键字。主关键字又可以称为主键。主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键。

主键是单表的概念

作用:

1)保证实体的完整性;
2)加快数据库的操作速度
3)在表中添加新记录时,ACCESS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
4) ACCESS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

特点:

1)一个表中只能有一个主键。如果在其他字段上建立主键,则原来的主键就会取消。在ACCESS中,虽然主键不是必需的,但最好为每个表都设置一个主键。
2)主键的值不可重复,也不可为空(NULL)。

3)主键值不能被重用

提示:虽然并不总是需要主键,但是多数数据库设计者都会保证他们创建的每个表具有一个主键,以便以后的数据库的操作和管理。

主键&复合主键&联合主键

主键

我们一般常说的主键就是单字段主键,我先看下主键的语法:

PRIMARY KEY [字段名]

复合主键

复合主键和联合主键一般是一个意思,就是指这个主键是由一张表中多个字段组成的,语法格式如下::

PRIMARY KEY [字段1,字段2,…,字段n]

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

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

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `studentId` varchar(32) NOT NULL COMMENT '学号',
  `studentName` varchar(32) NOT NULL COMMENT '姓名',
  `studentGender` varchar(32) NOT NULL COMMENT '性别',
  `studentAge` int DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`studentId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生信息表';

DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `course` (
  `courseId` varchar(32) NOT NULL COMMENT '课程id',
  `courseName` varchar(32) NOT NULL COMMENT '课程名称',
  `courseCredit` varchar(32) NOT NULL COMMENT '课程学分',
  PRIMARY KEY (`courseId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='课程信息表';

DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
  `studentId` varchar(32) NOT NULL COMMENT '学号',
  `courseId` varchar(32) NOT NULL COMMENT '课程id',
  PRIMARY KEY (`studentId`,`courseId` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生选课表';

有的文章把联合主键理解成2张表的关联,比如把选课表看成是学生表和课程表之间的关联,事实是不准确的,因为选课表就是一张表而已,语法也是单表的语法,不存在多表的主键语法(类似外键那样的多表间带约束的语法)

删除主键约束

当一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。

ALTER TABLE student DROP PRIMARY KEY;

由于主键约束在一个表中只能有一个,因此不需要指定主键名就可以删除一个表中的主键约束。

如果主键不存在或已经被删除,再次尝试删除会报错:
在这里插入图片描述

参考
《主键的概念作用及特点》
《MySQL主键(PRIMARY KEY)》

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐