本人声明:
本人正处于学习oracle阶段,这是学习过程中遇到的一个问题。此次博客的写作目的是记录学习过程中自己的解决问题的过程以及自己的思考。如果有任何错误欢迎指正~
学习过程中对于主键与外键约束问题模糊不清
经查找,个人思考结果如下:
我认为外键存在的原因是解决数据放在一个表这个问题。至于所有数据放在一个表的缺点经查找有以下三点:
- 表的组织结构复杂不清晰
- 浪费空间
- 扩展性极差
所以呢,没有主键就不会有外键。外键与主键约束的列都是相同的,同时外键所约束的列值--->主键中一定会存在,主键所约束的列值--->外键不一定存在。这就像一个包含关系。这里,我混淆了的一点就是,子表中的多行数据可以对应于主表中的一行数据--->而前面又说“外键与主键约束的列都是相同的”。这里我现在明白过来的是。表中数据多对一,不是外键所约束的列数可以多列对应主键约束的列。
这的确是一个挺白痴的问题。不过也多亏这个问题,我才去查找资料,对于主键以及外键有了更深的理解。这里多行数据就像一个公司里一个员工可以同时在两个部门,而这个员工无论在多少个部门都在这个公司里。而外键与主键所约束的列数为什么又一会儿单个,一会儿多个呢?这是取决于主键,因为主键约束的列可以不止一个。而关联主表的外键就必须能找到主表中的primary key,那么就应该与主键保持一致呀。
这里有一个问题,子表的外键可以作为子表的主键吗?
这里是我引申出来思考的问题,我的答案是不可以。某种情况下的确可以,即不存在上述多行数据对应一行数据的情况。
而我的答案为什么是不可以。数据库即是将繁多的数据整合,支持人们高效的查找,以及对数据进行处理。这包含着理性的美感。我觉得我们要想学好代码这些,要先学会遵守规则,理解规则。规则不是代表着死板,相反我觉得规则具有美感。这里面蕴含着人们理性的思辨工程,不是一条简简单单的文字罗列出来。主键即唯一。我觉得就目前而言我的学习中,我一直把这句话放在心头。想到一条数据第一个想法便是主键。我现在想到了一个很有趣的问题,如果把地球上的所有人看做一张表。你觉得什么是你的主键?
我来谈谈我的想法,不是名字,不是外貌,不是思想。是你自己,你自己本身就是主键。一不小心说多了。不过这个博客可能也不会有什么人看吧。当成自己骚话连篇本挺好的。
以下是我从其他资料节选出来的我认为较重要的几句话:
- 表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系
- 创建外键的表即为子表,子表的外键关联了主表的主键
- 外键创建多个列约束还是单个列约束取决于主表的主键
- 外键的值在与之关联的主表中一定出现
下面是基于单列的外键
创建主表
CREATE TABLE Father_TB01
(
ID_P int NOT NULL PRIMARY KEY,
FatherName varchar(20) NOT NULL
)
创建子表
CREATE TABLE Son_TB02
(
ID_O int NOT NULL PRIMARY KEY,
SonName varchar(20) NOT NULL,
ID_P int FOREIGN KEY references Father_table(ID_P)
)
同时子表中那句:
ID_P int FOREIGN KEY references Father_table(ID_P)
可以替代为:
ID_P int NOT NULL,
CONSTRAINT fk_FathSon FOREIGN KEY (ID_P) REFERENCES Father_table(ID_P)
下面是基于多列的外键
创建主表
CREATE TABLE Father_TB03
(
ID_P int NOT NULL,
FatherName varchar(20) NOT NULL,
CONSTRAINT pk_Father PRIMART KEY(ID_P,FatherName)
)
创建子表
CREATE TABLE Son_TB04
(
ID_O int NOT NULL PRIMARY KEY,
SonName varchar(20) NOT NULL,
ID_P int NOT NULL,
FatherName varchar(20) NOT NULL,
CONSTRAINT fk_FathSon FOREIGN KEY (ID_P,FatherName) REFERENCES Father_table03(ID_P,FatherName)
)
当然还有表存在时,怎么创建外键呢
CREATE TABLE Father_TB05
(
ID_P int NOT NULL,
FatherName varchar(20) NOT NULL,
CONSTARINT pk_Father primary key(ID_P,FatherName)
);
CREATE TABLE Son_TB04
(
ID_O int NOT NULL PRIMARY KEY,
SonName varchar(20) NOT NULL,
ID_P int NOT NULL,
FatherName varchar(20) NOT NULL,
);
ALTER TABLE Son_TB04
add constraint fk_Son_Farher foreign key(ID_P,FatherName) references Father_TB05(ID_P,FatherName);
以上便是全部内容~