关于外键约束的一点疑问 为什么要外键约束

summily 2010-03-15 04:37:55
有两个表

表 题库
题号 题目内容 题目答案
1 aaa AAA
2 bbb BBB
3 ccc CCC



表 答案
题号 姓名 时间 个人答案
3 xx xx zz
3 xxx xxx zzz
3 y yyy z

很明显,一个人可以做很多题,表题库里面的数据与表答案里面的数据是一对多的关系,鄙人刚学数据库,学到外键约束内容,为什么要把两个表设置成外键约束起来,答题的时候从题库中抽取题目,个人填写上答案,保存答案的时候连题库表中的题号一块保存上,查看这个人的答案的时候,拿着表答案中的题号直接去查题库中的题目不就行了,虽然答案表中的题号字段中的数据都是题库表中的题号,但关联上感觉没用啊。
...全文
555 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sql_sf 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 summily 的回复:]
引用 3 楼 sql_sf 的回复:
主要是要保持数据的完整性与一致性
既然题库中没有
就不能出现在答案表里面

楼主的意思是两个表关联
如果答案表里面的题号不在题库里呢
岂不是就是垃圾数据了,成了无头尸了

还是不明白,要往答案表里面写数据时都从题库表中取到题号了,保存的时候连题号一起保存到答案库里,什么情况下会出现无头尸呢
[/Quote]
如果从题库删除一条记录
此时必须将答案表对应的题号删除(当然也可以通过别的方法实现,触发器等)
外键就可以自动做到
summily 2010-03-15
  • 打赏
  • 举报
回复
明白了 谢谢楼上几位
chuifengde 2010-03-15
  • 打赏
  • 举报
回复
就是从系统级别用题库表中的题号来约束答案表中的题号,通俗的讲就是只有先有题库中的题才在答案表中有答案,如果只往答案表中加一条在题库中没有这个题号的记录,此时就所外键约束方面的错
SQL77 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 summily 的回复:]
引用 3 楼 sql_sf 的回复:
主要是要保持数据的完整性与一致性
既然题库中没有
就不能出现在答案表里面

楼主的意思是两个表关联
如果答案表里面的题号不在题库里呢
岂不是就是垃圾数据了,成了无头尸了

还是不明白,要往答案表里面写数据时都从题库表中取到题号了,保存的时候连题号一起保存到答案库里,什么情况下会出现无头尸呢
[/Quote]
例如你删除了主表的一条数据,没有约束你可以直接删除,而明细表里面的数据还是有的
summily 2010-03-15
  • 打赏
  • 举报
回复
多少有点开窍了
summily 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sql_sf 的回复:]
主要是要保持数据的完整性与一致性
既然题库中没有
就不能出现在答案表里面

楼主的意思是两个表关联
如果答案表里面的题号不在题库里呢
岂不是就是垃圾数据了,成了无头尸了
[/Quote]
还是不明白,要往答案表里面写数据时都从题库表中取到题号了,保存的时候连题号一起保存到答案库里,什么情况下会出现无头尸呢
ljt122000 2010-03-15
  • 打赏
  • 举报
回复
理是这个理,感觉用上了没用,只是你这个很简单,也可以不用外键,现在有的公司也开始不用外键了.
但是表多了数据量大了就可能出现问题,外键就是保证数据的一致性,如果没有外键出了问题,哪麻烦就大了,你要相信设计数据库的不是傻子,存在即合理........呵呵
--小F-- 2010-03-15
  • 打赏
  • 举报
回复
外键的作用:

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

例如:

a b 两个表

a表中存有客户号,客户名称

b表中存有每个客户的订单

有了外键后

你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x

建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

指定主键关键字: foreign key(列名)

引用外键关键字: references <外键表名>(外键列名)

事件触发限制: on delete和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 update cascade);

说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。

今天有朋友问我"外键的作用是什么"
当朋友问我外键的作用是什么时,我也愣了一下,平常都是在这么用,还没有真正的总结过,外分键的作用呢.下面,我总结了一下外键的作用:

外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。

FOREIGN KEY 约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。例如,如果在 publishers 表中删除一个出版商,而这个出版商的 ID 在 titles 表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles 表中该出版商的书籍因为与 publishers 表中的数据没有链接而变得孤立了。FOREIGN KEY 约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。

外键是用来控制数据库中数据的数据完整性的

就是当你对一个表的数据进行操作

和他有关联的一个或更多表的数据能够同时发生改变

这就是外键的作用
sql_sf 2010-03-15
  • 打赏
  • 举报
回复
主要是要保持数据的完整性与一致性
既然题库中没有
就不能出现在答案表里面

楼主的意思是两个表关联
如果答案表里面的题号不在题库里呢
岂不是就是垃圾数据了,成了无头尸了
summily 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sql77 的回复:]
主要是实现数据完整性,不能明细表有,主表没有
[/Quote]
什么意思 不约束一样可以很完整啊 两个表都能对应起题号来
SQL77 2010-03-15
  • 打赏
  • 举报
回复
主要是实现数据完整性,不能明细表有,主表没有

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧