数据库:“主键”
数据库☞主键
本文主要是根据对数据库的相应学习,并对数据库中的一个重要的知识点——主键 进行总结!
中间也会穿插其他的一些知识点,例如外键、关系型数据库吖等。
前言
主键的应用是很重要的,这对于数据库的设计十分重要!泛型【在整理中~后贴哦】
一、概念
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。
二、设计原则
关系数据库依赖于主键【它是数据库物理模式的基石】。
主键在物理层面上只有两个用途:
(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)手动增长型字段
在插入语句时,自定义主键字段插入相应类型的数据即可。
事实上,还有许多的主键选取策略,在这边不再深入总结。
上述的这些已经能够对主键有一个比较清晰的认识啦!
下一篇: Oracle-数据库对象
推荐阅读
-
通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
-
PHP基于单例模式实现的数据库操作基类
-
使用wordpress的$wpdb类读mysql数据库做ajax时出现的问题该如何解决
-
C#操作数据库中存取图片文件的方法
-
C#访问SQL Server数据库的实现方法
-
sql server 2008 压缩备份数据库(20g)
-
利用Python如何批量修改数据库执行Sql文件
-
【数据库】到底什么是关系?
-
三大常用关系型数据库事务详解之二:基本事务命令
-
Navicat怎么连接PostgreSQL数据库?Navicat Premium新建连接PostgreSQL数据库教程