数据库主键和外键

1 什么是主键 外键数据库

 学生表(学号,姓名,性别,班级)     学号是一个主键函数

 课程表(课程号,课程名,学分)    课程号是一个主键设计

 成绩表(学号,课程号,成绩)     学号和课程号的属性组构成一个主键索引

 成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键事务

 定义:若是公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另外一个关系的外键it

 以一个关系的外键做主关键字的表被称为主表,具备此外键的表被称为主表的从表效率

2 外键的做用书籍

 外键用于保持数据一致性,完整性数据类型

 主要目的是控制存储在外键表中的数据时间戳

3 主键的设计原则

 1)主键应当是对用户没有意义的

 2)主键应该是单列的,以提升链接和筛选操做的效率

   复合键的使用一般出于两点考虑:

    a)主键应当具备意义-----这为认为的破坏数据库提供了方便

    b)在描述多对多关系的链接表中可使用两个外部键做为主键------该表可能成为其余从表的主表,并成为从表的主键的一部分,使得以后的从表包含更多的列

 3)永远不要更新主键

 4)主键不该该包含动态变化的数据(时间戳等)

 5)主键应当由计算机自动生成

4 数据库主键选取策略

 创建数据库的时候,须要为每张表指定一个主键(一个表只能有一个主键,可是能够有多个候选索引)

 常见的主键选取方式有:

 1)自动增加型字段

  自动增加型主键会省略不少繁琐的工做,但在数据缓冲模式下,不能预先填写主键与外键的值

  Order(OrderID,OrderDate)   //主键OrderID是自动增加型字段

  OrderDetail(OrderID,LineNum,ProductID,Price)

  若是要在Order表中插入一条记录,在OrderDetail表中插入若干条记录,为了能在OrderDetail表中插入正确的OrderID字段,必须先更新Order表以得到系统系统分配的OrderID,可是为了确保数据一致性,Order表和OrderDetail表必须在事务保护下同时进行更新,这显然是矛盾的

  除此以外,当须要在多个数据库之间进行数据复制时,自动增加型字段可能形成主键冲突

 2)手动增加型字段

 3)使用UniqueIdentifier SQL Server提供一个UniqueIdentifier数据类型(16字节),并提供一个生成函数NEWID(),生成一个惟一的UniqueIdentifier

 4)使用COMB类型

  保留UniqueIdentifier的前10字节,后6字节表示生成时间

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

1 外键

 外键(FK)是用于创建或增强两个表数据之间的连接的一列或多列。

 经过将表中主键值的一列或多列添加到另外一个表中,可建立两个表之间的链接,这个列就成为第二个表的外键

 FK约束的目的是控制存储在外表中的数据,同时能够控制对主键表中数据的修改

 例如:publishers表中记录出版商的信息,titles表中记录书的信息,若是在publishers的表中删除一个出版商,而这个出版商的ID在titles表中记录书的信息时被使用了,则这两个表之间关联的完整性将被破坏,即titles表中该出版商的书籍由于与publisher表中的数据没有连接而变的孤立。

 FK约束能够防止这种状况的发生,若是主键表中数据的更改使得与外键表中数据的连接失效,则这种更改是不能实现的;若是试图删除主键表中的行或试图修改主键值,而该主键值与另外一个表的FK约束值相关,则该操做不可实现。若要成功的更改或删除FK约束的行,能够如今外键表中删除外键数据或更改外键数据,而后将外键链接到不一样的主键数据上去

 外键主要是用来控制数据库中的数据完整性的,当对一个表的数据进行操做时,和他有关联的一个表或多个表的数据可以同时发生改变 

 例子:

 A(a,b) :a为主键,b为外键(来自于B.b)

 B(b,c,d) :b为主键

 A中的b字段要么为空,要么为B表中存在的b值

相关文章
相关标签/搜索