求教个基础问题

listedbandit 2008-04-17 11:10:37
看书上我实在无法理解什么是外键 也没个例子 越想越糊涂 只好请教来了 麻烦帮我解释下
主键外键的作用就别解释了 这个书上可以翻到

我举个具体的例子吧
A表
字段a 字段b 字段c 字段d
字段a是主键

B表
字段a 字段e 字段f 字段g
字段a是主键

C表
字段a 字段h 字段i 字段j
字段a是主键

D表
字段k 字段l 字段m 字段n
字段k是主键

B表和C表的字段a以A表的字段a为主 就是说A表的字段a起决定性作用 A表里字段a的值为10的记录删了 B、C表里对应该条记录也自动删除(可以自动吗?增加好像是不可以 baidu过了?或是指的删除字段?)
我该设置A表里的字段a为外键 还是B、C表里的字段a为外键?
外键到底是参照别的表的 还是被别的表参照的

D表的字段m要和C表的字段a相同或是字段i相同或是D表的字段k要与C表的字段i相同 又是什么情况
...全文
124 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
listedbandit 2008-04-19
  • 打赏
  • 举报
回复
外键到底是参照别的表的 还是被别的表参照的
外键,是此表 参照 本表以外的主健

设置外键是用来约束另一个表的某个字段即另一个表的某个字段删除记录时,还要(根据规则)考虑这个表的存在。

1)D表的字段m要和C表的字段a相同,字段a可设为字段m的外键
3)或是D表的字段k要与C表的字段i相同 则 k 可作为i 的外键。

你一共有两个矛盾的地方 呵呵
listedbandit 2008-04-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 suntoto 的回复:]
${A表:字段a}是${B表:字段a} 的外键
[/Quote]
我想你这句也是错的
listedbandit 2008-04-19
  • 打赏
  • 举报
回复
设置外键是用来约束另一个表的某个字段即另一个表的某个字段删除记录时,还要(根据规则)考虑这个表的存在。
======================================================================
我想我应该明白了 而且这句话是错的 被设置为外键的列还是被它参照或者引用的列约束的 指的应该还是记录
listedbandit 2008-04-19
  • 打赏
  • 举报
回复
设置外键是用来约束另一个表的某个字段即另一个表的某个字段删除记录时,还要(根据规则)考虑这个表的存在。
====================================================================
我不同意这个说法 既然是用来约束另外一张表的 那就是我有记录1、2、3、4、5 那你就只能有在这5条之中的记录
你删除 对我有什么影响 但是我删除 对你有影响

难道说这个约束的意思指的是约束另外一张表的动作而不是约束另外一张表的记录?
这两个意思正好相反 难怪我不能明白 我一直以为约束指的约束是另外一张表的记录

那我的问题要更明确一点

A表
字段a 字段b
B表
字段a 字段c
A表的字段a为主 B表的字段a受限 就是说B表里的记录字段a的值要是A表里有的 不用管其他问题 不用多做解释 按如下格式给个明确答案就好
${表名:字段名}设置为外键
${表名:字段名}是${表名:字段名} ¦${表名}的外键
${}表示占位待替换
listedbandit 2008-04-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 suntoto 的回复:]
设置外键是用来约束另一个表的某个字段即另一个表的某个字段删除记录时,还要(根据规则)考虑这个表的存在。
${A表:字段a}是${B表:字段a} 的外键
[/Quote]
晕 你还是只回答了一半
光说谁是谁的外键 我还是无法判断谁要被设置成外键

我说了不用做其他解释 所以我在19楼就没说谁是主键了
[Quote]
A表
字段a 字段b
B表
字段a 字段c
A表的字段a为主 B表的字段a受限 不用管其他问题 不用多做解释 按如下格式给个明确答案就好
${表名:字段名}设置为外键
${表名:字段名}是${表名:字段名} ¦${表名}的外键
${}表示占位待替换[/Quote]

为什么这个问题我理解起来这么难呢

如果 A表 和 B表 有且只有字段a是主键!!!
在数据库设计上应合并为一个表
我想这个问题我要解释下
A表
字段a 字段x 字段xx ……
a主键

B表
字段a 字段y 字段yy ……
a主键

我当然也知道可以合成一张表 但是某些页面只要访问A表里的那些字段 某些页面只要访问B表里的那些字段 而且字段很多 A表里有的记录 B表里可以没有 但不能B表里有A表没有的记录 也就是说B表里的那些字段可以为空 取默认值也可以 如果我合成1张表 那都要从这一张表里来查询 我分成两张表 不还是为了提高响应速度嘛 浏览不同的页面 访问对应的表就可以了 不设置外键当然也可以 但我现在主要想弄懂这个外键的概念
suntoto 2008-04-19
  • 打赏
  • 举报
回复
${A表:字段a}是$ b表:字段a}的外键 字面上错了
外键 定义 包括 名称 fname
要定义外键的字段: b表:字段a
对应另一个表的相应主键:a表:字段a
依赖关系:
依赖关系有三种1)如果b表存在纪录,则a表相应纪录不能删除
2)casecade :删除a表纪录时,删除b表相应纪录
3)set null : 删除a表纪录时,删除b表相应纪录置空
suntoto 2008-04-19
  • 打赏
  • 举报
回复
发个图给你看看,告诉我邮箱。
suntoto 2008-04-19
  • 打赏
  • 举报
回复
兄弟,你歇歇在学吧,在关系数据库中之所以用外键就是为了表征 表之间的关系
先理解这一句。
listedbandit 2008-04-18
  • 打赏
  • 举报
回复
今天晚上肯定睡不好了
listedbandit 2008-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dawugui 的回复:]
就楼主的四个表中A,B,C表的字段a都是主键,不存在哪个是哪个的外键.

真正的外键应该是这样的:

A表
Aid , name

B表
Bid , Aid , Bname

其中B表Aid是A表的外键.
[/Quote]
老大 你这只说了谁是谁的外键 没说设置谁为外键啊
把A表的Aid设为外键来约束B标的Aid 也可以说B表的Aid是A表的外键啊 只是说法而已嘛 完全可以说的通的
而且就算B表Aid是A表的外键.也无法确定谁是主谁是次啊
我就是因为这样才不能理解 不知道我是语文太好了 还是太差了 不过我喜欢咬文嚼字 因为文字问题不能理解也不只这一个地方 反正高考90分基础题得89分 60分作文得20分 中考作文改错20分满分 作文40分得20分左右
listedbandit 2008-04-18
  • 打赏
  • 举报
回复
D表的字段m要和C表的字段a相同或是字段i相同或是D表的字段k要与C表的字段i相同 又是什么情况
1)D表的字段m要和C表的字段a相同,字段a可设为字段m的外键
3)或是D表的字段k要与C表的字段i相同 则 k 可作为i 的外键。
矛盾了吧

先谢谢你 不过不用解释那么多 也不用管我ABC3个表的设计是否合理 所以我加了一个D表 直接告诉我A、B、C表中是A表的字段a设为外键 还是B、C表中的字段a设为外键 只要告诉我结果 不用多做解释

或者直接告诉我某个表设置外键是用来约束另一个表的某个字段还是用来参照另一个表的某个字段(即被约束) 按照书上的理解似乎是用来约束的 但看你们解释似乎是被约束的

不用拿实际带有逻辑的例子来解释 我就是想要个通用的 所以我用字段a 字段b来问

我为什么不能理解这个问题 因为我觉得外键是个相对的概念(撇开SQL中已经形成的规定) 就像外国人一样 你称美国人是外国人 美国人也称呼你是外国人 所以A表的字段a是B表字段a的外键 那B表字段a当然也可以称为A表字段a的外键 但实际上却是单方面的 书上并没有明确说明 而且外键的作用是约束还是被约束 似乎也不是很明确 所以我不能理解到底哪一个该设置为外键 前面两位大大只给我解释了一半 其实我需要的答案很简单

A表
字段a 字段b
B表
字段a 字段c
A表的字段a为主 B表的字段a受限 不用管其他问题 不用多做解释 按如下格式给个明确答案就好
${表名:字段名}设置为外键
${表名:字段名}是${表名:字段名}|${表名}的外键
${}表示占位待替换
suntoto 2008-04-18
  • 打赏
  • 举报
回复
其实一般不用建这样的键,自己逻辑清楚就可以了!

如果学生表删除 张三记录,而成表不这样
在不存在 张三 情况下 仍能查询到张三的成绩,造成数据库信息没有满足 完整性要求(正确性,相容性)
设计数据库的基本原则
1)现实世界中对象的个数和数据库中的记录数 对应
即一个学生不能对应两条记录。
2)纪录的每行字段应表达现实对象的属性
3)现实世界对象的关系应反映到纪录之间的关系

楼上忽略第三条。
suntoto 2008-04-18
  • 打赏
  • 举报
回复
设置外键是用来约束另一个表的某个字段即另一个表的某个字段删除记录时,还要(根据规则)考虑这个表的存在。
${A表:字段a}是${B表:字段a} 的外键

A表
字段a 字段b 字段c 字段d
字段a是主键

B表
字段a 字段e 字段f 字段g
字段a是主键

如果 A表 和 B表 有且只有字段a是主键!!!
在数据库设计上应合并为一个表
就像一句话要说完,
1)现实世界中对象的个数和数据库中的记录数 对应
即一个学生不能对应两条记录。
就像
表1
学号 姓名
表2
学号 性别
表3
学号 年龄

hackztx 2008-04-18
  • 打赏
  • 举报
回复

/*
学生表和成绩表

每个学生都有一个编号例如
PKID Name Age ...
1 zhangsan 15

成绩表如果是
PKID Sort Point Name Age
1 语文 90 张三 15

这样显然是很浪费的所以
PKID Sort Point PeopleID
1 语文 90 1

你可以把学生编号当作主键,通过成绩表的外键PeopleID绑定到学生表的PKID主键

做的好点把那个sort也数字化

其实一般不用建这样的键,自己逻辑清楚就可以了!

*/
suntoto 2008-04-18
  • 打赏
  • 举报
回复
改一下
设计数据需满足3个范式
1)每个属性(字段)都是不可分解的
如有两个表 学生表 班级表
学号: 班级编号:
姓名: 班级名称:
性别: 班主任: 班级编号 为主键
年龄:
班级名称: 学号为主键
那么参照第一范式,学生表设计有问题,因为学生表的班级属性还可细分
其正确设计如下
学生表 班级表
学号: 班级编号:
姓名: 班级名称:
性别: 班主任: 班级编号 为主键
年龄:
班级编号: 学号为主键
但这样就产生了外键的问题,因为学生表只有班级编号,不关联相应表着表述不清
刚刚学习数据库也许会这样做,我插入学生表的班级名称从班级表里查询而来,不就能保持两个表数据一至了吗?
我刚开始时也是这样想的,后来明白了这样不行,比如 张三在 三年级一班 ,编级表里开始设置有三年级一班,可后来三年级一班被删除了
那么 学生表和班级表就不一致了,张三在 三年级一班,编级表里开始没有三年级一班矛盾
因此用到了外键,用班级表 班级编号 作为 学生表的 班级编号 字段的外键
约束关系:当删除班级表的班级编号 1#记录 (假设对应三年级一班)时,要么不允许,要么 学生表删除张三记录,要么学生表中将张三记录中班级编号设为null
2)第二凡是,在满足第一范式的情况下,非主键字段完全依赖于主键字段。

3)第三范式 每个非键不传递依赖于其他候选键

但愿对你有益!!!
suntoto 2008-04-18
  • 打赏
  • 举报
回复
A表里字段a的值为10的记录删了 B、C表里对应该条记录也自动删除(可以自动吗?
记录是否删除,要看定以外键时的依赖关系有三种1)rextrict :如果b表存在纪录,则a表相应纪录不能删除
2)casecade :删除a表纪录时,删除b表相应纪录
3)set null : 删除a表纪录时,删除b表相应纪录置空
我该设置A表里的字段a为外键 还是B、C表里的字段a为外键
要看你需要了,如果A,B,C 三表 字段a 为主键,则无关紧要,如果其中只有一个表中字段a为主键,那么就只能选那个表了
外键 只能是另一个表的主键
外键到底是参照别的表的 还是被别的表参照的
外键,是此表 参照 本表以外的主健

D表的字段m要和C表的字段a相同或是字段i相同或是D表的字段k要与C表的字段i相同 又是什么情况
1)D表的字段m要和C表的字段a相同,字段a可设为字段m的外键
2)D表的字段m要和C表的字段i相同,因为两者都不是主键,不能建立关系。如果在抽象,可同时在关联其他表的主键。
3)或是D表的字段k要与C表的字段i相同 则 k 可作为i 的外键。
设计数据需满足3个范式
1)每个属性(字段)都是不可分解的
如有两个表 学生表 班级表
学号: 班级编号:
姓名: 班级名称:
性别: 班主任: 班级编号 为主键
年龄:
班级: 学号为主键
那么参照第一范式,学生表设计有问题,因为学生表的班级属性还可细分
其正确设计如下
学生表 班级表
学号: 班级编号:
姓名: 班级名称:
性别: 班主任: 班级编号 为主键
年龄:
班级编号: 学号为主键
但这样就产生了外键的问题,因为学生表只有班级编号,不关联相应表着表述不清
刚刚学习数据库也许会这样做,我插入学生表的班级名称从班级表里查询而来,不就能保持两个表数据一至了吗?
我刚开始时也是这样想的,后来明白了这样不行,比如 张三在 三年级一班 ,编级表里开始设置有三年级一班,可后来三年级一班被删除了
那么 学生表和班级表就不一致了,张三在 三年级一班,编级表里开始没有三年级一班矛盾
因此用到了外键,用班级表 班级编号 作为 学生表的 班级编号 字段的外键
约束关系:当删除班级表的班级编号 1#记录 (假设对应三年级一班)时,要么不允许,要么 学生表删除张三记录,要么学生表中将张三记录中班级编号设为null
2)第二凡是,在满足第一范式的情况下,非主键字段完全依赖于主键字段。

3)第三范式 每个非键不传递依赖于其他候选键

但愿对你有益!!!







listedbandit 2008-04-17
  • 打赏
  • 举报
回复
A表的某个字段设为外键来约束B表的某个字段
这样A表的那个字段为主

还是A表的某个字段设为外键来参照B表的某个字段
这样B表的那个字段为主
listedbandit 2008-04-17
  • 打赏
  • 举报
回复
直接跟我说吧
A表的某个字段设为外键来约束B表的某个字段 还是A表的某个字段设为外键来参照B表的某个字段
谢谢了 只有这样我才能理解
listedbandit 2008-04-17
  • 打赏
  • 举报
回复
我现在脑子快要爆炸了
为什么我感觉是这样
table:publishers           table:titles 
pub_id PK <---- title_id PK
pub_name ¦ title
¦ type
------ pub_id FK
listedbandit 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dawugui 的回复:]
就楼主的四个表中A,B,C表的字段a都是主键,不存在哪个是哪个的外键.

真正的外键应该是这样的:

A表
Aid , name

B表
Bid , Aid , Bname

其中B表Aid是A表的外键.
[/Quote]
就是说B表的Aid设置为外键参照A标Aid里的数据?而不是设置A表的Aid为外键来约束B标的Aid?

就楼主的四个表中A,B,C表的字段a都是主键,不存在哪个是哪个的外键.
但是我需要这么做 合并到一张表里 都要访问这个表 怕影响速度 所以按功能把它分成几份 A表为主
加载更多回复(8)

34,576

社区成员

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

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