欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库:“主键”

程序员文章站 2022-03-03 20:02:37
...

数据库☞主键

本文主要是根据对数据库的相应学习,并对数据库中的一个重要的知识点——主键 进行总结!
中间也会穿插其他的一些知识点,例如外键、关系型数据库吖等。



前言

主键的应用是很重要的,这对于数据库的设计十分重要!

关系型数据库总结—易理解!

泛型【在整理中~后贴哦】


一、概念

主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。

二、设计原则

关系数据库依赖于主键【它是数据库物理模式的基石】。
主键在物理层面上只有两个用途:
(1)惟一地标识一行。
(2)作为一个可以被外键有效引用的对象。

  • 原则1:主键应当是对用户没有意义的

其实从设计角度来说主键对用户无意义最好,为什么呢?
主键最主要的作用就是保证实体的完整性,加快数据库的操作速度。但往往在范式的规范下,有时候主键的组成不止由单属性组成,此时在操纵数据库中的数据时会比较麻烦 。
另外,有初学者会想,主键不是唯一么?主键也不能为空等等。很多时候简单的表格会以用户名这种作为主键,但是不要忘记当用户数量过于庞大时,会带来很多的麻烦,亦或者说,如果你想用唯一属性可以使用UNIQUE,而主键有时候有自增的功能可以省去很多的麻烦等等。

  • 原则2: 主键应该是单列的

就像我上一个原则里说的一样,主键有时候会由多属性组成,此时操作起来会出现很多问题(DuplicateKeyException…),主键应该是单列的以便提高连接和筛选操作的效率。

  • 原则3:永远也不要更新主键

主键在实际中是可以被更新的,但是设计的时候最好考虑的是不要更新主键。

  • 原则4:主键不应包含动态变化的数据

如时间戳、创建时间列、修改时间列等这些动态变化的数据不应该被定义为主键;主键是不可被直接修改的。


三、SQL定义主键约束(实体完整性)

在实例说明之前,先说一下主键的作用:

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

栗子:(具体的e-r图等,在这篇文章☞关系型数据库总结—易理解!都有介绍,可以观看哦~)
读者表 Reader

/*
* 单属性:主键只有一个属性组成
*/
/*一、主键约束:列级完整性约束*/
CREATE TABLE m_reader
(
rno varchar(10) PRIMARY KEY,       --- 设置为主键 /*列级完整性约束条件*/
rname varchar(10) UNIQUE not NULL,  ---  不许取空值      
rgender varchar(4) DEFAULT '男'  CONSTRAINT consgender CHECK (sgender IN('男', '女')),							  ---  (下)设置默认值男,约束选项为男女
rtel  char(11),
rmajor  varchar(10),
rregist date,
rtype varchar(10),
FOREIGN KEY (rtype) REFERENCES m_readerType(rtype)
    ----(参照完整性)声明是什么表中的外键(m_readerType:读者类型表)
)




/*一、主键约束:表级完整性约束*/
CREATE TABLE m_reader
(
r_no varchar(10) NOT NULL,          --- 设置为主键 /*列级完整性约束条件*/
r_name varchar(10) UNIQUE not NULL,  ---  不许取空值      
r_gender varchar(4) DEFAULT '男'  CONSTRAINT consgender CHECK (sgender IN('男', '女')),							  ---  (下)设置默认值男,约束选项为男女
r_tel  char(11),
r_major  varchar(10),
r_regist date,
r_type varchar(10),
PRIMARY KEY (r_no),				  --- 设置为主键 /*表级完整性约束条件*/
FOREIGN KEY (r_type) REFERENCES m_readerType(r_type)
    ----(参照完整性)声明是什么表中的外键(m_readerType:读者类型表)
)





/*多属性:只能用表级完整性约束*/
---转换一下借阅表,将借阅编号暂删除。
CREATE TABLE m_borrow
(
b_time date ,          
b_num int , 
b_ReturnTime date,
r_no varchar(10),           		 --外键
b_no varchar(10),			    --外键
PRIMARY KEY (r_no,b_no),			--- 设置为主键 /*表级完整性约束条件*/表示由读者编号和图书编号共同决定了一次借阅信息。
FOREIGN KEY (r_no) REFERENCES m_reader(r_no),
FOREIGN KEY (b_no) REFERENCES m_book(b_no)
    ----(参照完整性)声明是什么表中的外键(m_book:图书信息表)
)

四、在不同的关系数据库中的主键选取策略

栗子:管理员表

(1)自动增长型字段

  • MySQL
/*
把表的主键设为auto_increment类型,数据库就会自动为主键赋值。
*/
CREATE TABLE m_user
(
m_id int auto_increment PRIMARY KEY NOT NULL,
m_name varchar(10) NOT NULL,       --- /*设置为主键,自增*/
m_password varchar(10) not NULL
)

insert into m_user values('name1','1234');
select m_id from m_user;

  • Oracle
/*
* 为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。
* 这个序列的起始值为1,增量为2
*/
create sequence m_name_seq increment by 2 start with 1;

CREATE TABLE m_user
(
m_id int PRIMARY KEY NOT NULL,
m_name varchar(10) NOT NULL,       --- /*设置为主键,自增*/
m_password varchar(10) not NULL
)
/*
curval:返回序列的当前值
nextval:先增加序列的值,然后返回序列值
*/
insert into m_user values(m_name_seq.nextval, 'name1','1234');
select m_id from m_user;
  • Sql Server
/*
如果把表的主键设为identity类型,数据库就会自动为主键赋值。
*/
CREATE TABLE m_user
(
m_id int identity(1,1) PRIMARY KEY NOT NULL,
m_name varchar(10)  PRIMARY KEY NOT NULL,       --- /*设置为主键,自增*/
m_password varchar(10) not NULL
)

insert into m_user values('name1','1234');
select m_id from m_user;

(2)手动增长型字段

在插入语句时,自定义主键字段插入相应类型的数据即可。

事实上,还有许多的主键选取策略,在这边不再深入总结。
上述的这些已经能够对主键有一个比较清晰的认识啦!