首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

剪不住,理不乱——数据库中主外键的关系

2012-08-28 
剪不断,理不乱——数据库中主外键的关系在做机房收费系统时,考虑到了主外键,所以学习了一下,下面我们一起来

剪不断,理不乱——数据库中主外键的关系

 

   在做机房收费系统时,考虑到了主外键,所以学习了一下,下面我们一起来探究一下它们的关系。

 

   主键Primary key,唯一标示一个实体。是保证数据库的实体完整性,保证数据中数据的正确性和合理性,取值非空唯一。

   外键Foreign,是用来使表与表之间联系。用来保证数据库的参照完整性,外键的取值必须来自参照表参照列的值,可以为空也可不为空。

 

    外键的作用:

   保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

 

    主外键的关系结构:

 

1,一对一,不用引用主外键,把它们放一个表中即可

     例如:一个学生只能有一个卡号,那么学生跟卡号放在一个表中即可

2,一对多,引用主外键,‘一’相当于主键,‘多’即是引用主键的外键。

     例如:一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系;

3,多对多关系,需要创建一个表,表中需要两个字段,分别是引用,两个多对多字段主键的外键。
      

     例如:


学生表(学号,姓名,…………)主键:学号
课程表(课程号,课程名,…………)主键:课程号
一个学生能选多门课,一个课可以由多个学生选,即是多对多关系,
那么成绩表就是它们之间关系的体,
即引用成绩表(学号,课程号,成绩)。这里学号和课程号,分别是学生表和课程表中学号和课程号的外键

在我们现在这个阶段中,主要还是使用,主外键间的一对多的关系

 

下面一起来简单看一下大概建成的表结构

 

--建班级表create table class(classid int primary key,--定义班级ID为主键classname varchar(15))


--建学生表create table students(studentid int primary key,--定义学生ID为主键classid int ,--外键值,跟班级表classid 属性类型相同stuname varchar(20),--学生姓名


---定义外键foreign key(classid) references class(classid) --本表classid是基于class表classid的外键)


   如上定义了主外键后,两个表间的关系就是一对多的关系了,并且学生表内的classid必须依托班级表的classid存在,也就是说外键必须要主键存在的时候才能创建,

 

例如:

 

--在班级表为空的情况往学生表插入一条记录是不允许的:

insert intostudents(studentid,classid,stuname)values(1,1,'小明')


 系统会抛出异常提示主键表班级表内班级ID不存在这样是不允许插入的;

必须要先往班级表内插入一条记录:

insert into class(classid,classname)values(1,'一班')


 后才能执行插入前面一条往学生表插入信息的语句..

 

   解释:

 

   对于机房收费系统来说,如图:

 剪不住,理不乱——数据库中主外键的关系

    只有当学生注册了信息,有了卡号,在学生信息表中存在了,才可以进行充值,退卡,上下机等,主外键的作用也就是当没有学生信息时,我们不可以进行充值等操作,而且想要删除学生信息表中的数据,必须先将充值表,退卡表,上下机表中此卡号的人删除之后才可以删除学生信息表中的数据,这样就避免了当学生未注册时,就可以充值的情况

 

    也就是说,如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。

 

    外键是用来控制数据库中数据的数据完整性的 。就是当你对一个表的数据进行操作和他有关联的一个或更多表的数据能够同时发生改变,这就是外键的作用

 

连接查询与内外键的关系:

 

    连接的 连接条件:A表的主键 = B表的外键如果做连接的两表没有主外键关系,那么连接结果没有意义。

 

    例:学生表和选课表做连接,select *from 学生表,选课表where 学生表.学号(主键)=选课表.学号(外键)

 

    主外键可以建级联级触发器,用来做级联删除、更新。作用原理还是因为主外键将两表联系。

 

 

17楼zhanglianhai55519分钟前
太厉害了。。
Re: hejingyuan614分钟前
回复zhanglianhai555n呵呵
16楼huang7988074811小时前
触发器不懂???
Re: hejingyuan61小时前
回复huang798807481n慢慢学习
Re: huang7988074811小时前
回复hejingyuan6n嗯呢,you too
Re: hejingyuan61小时前
回复huang798807481n我是说我在慢慢学,呵呵
Re: huang7988074811小时前
回复hejingyuan6n不是哦,你都学得高深莫测啦,呵呵,
Re: hejingyuan638分钟前
回复huang798807481n呵呵,太夸张了吧!我们才刚开始,一起学吧
Re: huang79880748138分钟前
回复hejingyuan6n嗯啦,得多多指教啦哈
Re: hejingyuan636分钟前
回复huang798807481n互帮互助,共同进步,呵呵
Re: huang79880748128分钟前
回复hejingyuan6n嗯嗯哈,好多sql语句不会写,
Re: hejingyuan623分钟前
回复huang798807481n恩恩,那就一起学
15楼zuozuo12452小时前
不错,学习了
Re: hejingyuan62小时前
回复zuozuo1245n呵呵
14楼wangyongxia9215小时前
好,写的不错,用上了
Re: hejingyuan62小时前
回复wangyongxia921n呵呵,谢谢
13楼XUJIAOlf7小时前
恩恩,学习了。
Re: hejingyuan66小时前
回复XUJIAOlfn恩,一起加油
12楼liutengteng1308小时前
挺不错的,加油啊。
Re: hejingyuan67小时前
回复liutengteng130n呵呵,一起加油
11楼lishehe12小时前
学习
Re: hejingyuan612小时前
回复lishehen恩
10楼cjr1523366114313小时前
清楚了
Re: hejingyuan613小时前
回复cjr15233661143n嘿嘿
9楼shuihuojiao14小时前
学习
Re: hejingyuan614小时前
回复shuihuojiaon呵呵
8楼xvshu14小时前
学些好东西!加油
Re: hejingyuan614小时前
回复xvshun嘿嘿
7楼yiluchahua昨天 20:40
不错,找机会亲自试试。谢谢楼主!
Re: hejingyuan614小时前
回复yiluchahuan呵呵
6楼han_yankun2009昨天 17:41
加油
Re: hejingyuan6昨天 19:30
回复han_yankun2009n一起加油
5楼han_yankun2009昨天 11:50
学习了呵呵
Re: hejingyuan6昨天 11:52
回复han_yankun2009n学习
4楼aboy123昨天 08:33
很好
Re: hejingyuan6昨天 08:41
回复aboy123n呵呵
3楼Wentasy昨天 08:18
学习了。
Re: hejingyuan6昨天 08:18
回复Wentasyn呵呵
2楼rryqsh昨天 08:17
一对一,不用引用主外键,把它们放一个表中即可nn在大型项目中,尤其是对数据库的访问量很大的情况下,经常会把一张大表有意得人为拆开,并进行一对一关联
Re: hejingyuan6昨天 08:18
回复rryqshn恩,了解了
1楼www_k2tiyu_com昨天 08:01
来学写学习了。。。
Re: hejingyuan6昨天 08:01
回复www_k2tiyu_comn一起学习

热点排行