数据库总结之外键再学习
来源:互联网 发布:访客网络最大下载速度 编辑:程序博客网 时间:2024/04/27 21:52
之所以称之为再学习,是因为此前曾学习过这些知识,只不过当时没有总结。现在再次遇到它,详细再学习一下,加深印象。
什么是外键?
如果公共关键字(表中相同的属性)是一个关系中的主关键字(primary key),那么这个公共关键字被称为另一个关系的外键。
相关概念解析:
公共关键字:多个表中的相同的属性或属性组。
主关键字:即主键。
关系:即一张表。
主表与从表
表A中有a、b两个字段,a字段是主键。表B有a、c两个字段。a字段可以设置外键。此时,表A为主表,表B为从表。
外键的作用:
1、数据完整性的(数据库基础理论书中所说的“参照完整性”的数据库实现方式。)
2、保持数据一致性,
3、控制存储在外键表中的数据
简而言之:当你对一个表的数据进行操作时和他有关联的一个或更多表的数据能够同时发生改变,这就是外键的作用。
外键约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。例如,如果在 publishers表中删除一个出版商,而这个出版商的 ID在 titles表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles表中该出版商的书籍因为与 publishers 表中的数据没有链接而变得孤立了。
外键约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的外键约束值相关,则该操作不可实现。若要成功更改或删除外键约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。
例如:
a b两个表
a表中存有客户号,客户名称
b表中存有每个客户的订单
有了外键后,你只能在确信b表中没有客户x的订单后,才可以在a表中删除客户x,否则b表中的数据就变得孤立了,即完整性缺失。
建立外键的原则:
1、为关联字段创建外键。
2、所有的键都必须唯一。
3、避免使用复合键。
4、外键总是关联唯一的键字段。
如何建立外键:
一、使用T-SQL语句:
指定主键关键字:foreign key(列名)
引用外键关键字:references <外键表名>(外键列名)
事件触发限制: ondelete和on update ,可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action
例如:
outTable表主键 id类型 int
创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on updatecascade);
说明:把id列设为外键,参照外表outTable的id列,当外键的值删除,本表中对应的列删除(on delete的作用),当外键的值改变,本表中对应的列值改变(on update的作用)。
二、使用DBMS关系图建立外键:
1、建表(见图,设置主键。)
2、新建关系图
3、选择添加表:
4、建立外键,将要建立外键关系表中主键字段拖向外键字段。
5、点击确定即可完成外键的建立。
使用外键的注意事项:
1、使两张表形成关联,外键只能引用外表中的列的值。
2、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。
3、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处非常明显
4、相对于触发器或程序完成的这个工作(指参照完整性约束),外键更方便。
5、阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。
6、建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键)。
- 数据库总结之外键再学习
- 数据库之外键学习
- 数据库设计之外键的思考
- SQL学习笔记(4)之外键
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
- 【VB.NE机房重构】数据库设计之外键
- Oracle数据库表的操作之外键连接
- 胡侃学习计算机--理论之外
- 胡侃学习计算机--理论之外
- Oracle数据库学习总结
- Oracle数据库学习总结
- Oracle数据库学习总结
- Mysql数据库学习总结
- 数据库设计总结学习
- oracle数据库学习总结
- oracle数据库学习总结
- SQLServer数据库学习总结
- '_beginthreadex' : undeclared identifier
- mod_extforward: 让lighttpd记录客户端的真实IP
- 提供给大家一些Android好资料---安卓巴士Android开发神贴整理
- <!--[if IE]>....<![endif]-->详解
- Content is not allowed in prolog. Nested exception: Content is not allowed in prolog
- 数据库总结之外键再学习
- 一种从unicode文本中逐行读取字符串的方法
- 《计算机教育》专题报道:一个老师,二百个学生,四个年级,百门课程
- bucket sort algorithm -- From Wiki
- 什么是ORM
- 停车场管理系统(有注释,改了几个bug的版本)
- Qt入门-QLabel类
- C++中const用法总结
- 生成排列