外键到底是用来干嘛的?谢谢

wowglr 2009-09-23 03:34:09
外键除了能保证数据的完整性以外,还有什么用途?

我理解的数据完整性是

用户表user
ID name bumen
1 tome 1
2 kate 2
3 james 1

部门表bumen
ID name
1 内务部
2 事务部

user表有个外键fk_UB,指向bumen表的主键
这样的话,当我删除bumen表中的数据的时候,数据库就会报错,因为user表里面还有对应的数据

其实如果在后台控制得好,这一步是不是可以省略了?因为在删除前一定是要先判断才能删除的。

如果说是多表查询,那不用外键不是也可以?inner join 中有没有外键好像没有什么差别

所以我有点儿搞不懂外键到底有什么作用了,请大家给指点下,我查过一些资料,所以请不要在百度上ctrl+v过来,我需要兄弟们自己的理解!!

万分感谢!!
...全文
563 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsd123 2009-09-23
  • 打赏
  • 举报
回复
.
devin-deng 2009-09-23
  • 打赏
  • 举报
回复
外键是根据数据库的设计来约束数据的完整
devin-deng 2009-09-23
  • 打赏
  • 举报
回复
回答:外键是数据库设计来约束数据完整
如果你有触发器之类的来维护关系的话,那外键也就无意义了

--下面是现在项目中用的插入约束
create or replace trigger TIB_TSCC0101 before insert
on CSAS.TSCC0101 for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
-- Declaration of InsertChildParentExist constraint for the parent "TXCD0003"
cursor cpk1_tscc0101(var_cost_center varchar,
var_product_code varchar) is
select 1
from TXCD0003
where COST_CENTER = var_cost_center
and PRODUCT_CODE = var_product_code
and var_cost_center is not null
and var_product_code is not null;

begin
-- Parent "TXCD0003" must exist when inserting a child in "CSAS.TSCC0101"
if :new.COST_CENTER is not null and
:new.PRODUCT_CODE is not null then
open cpk1_tscc0101(:new.COST_CENTER,
:new.PRODUCT_CODE);
fetch cpk1_tscc0101 into dummy;
found := cpk1_tscc0101%FOUND;
close cpk1_tscc0101;
if not found then
errno := -20002;
errmsg := 'Parent does not exist in "TXCD0003". Cannot create child in "CSAS.TSCC0101".';
raise integrity_error;
end if;
end if;


-- Errors handling
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;

wowglr 2009-09-23
  • 打赏
  • 举报
回复
41L

慢慢理解。。。我得整理一下先。。。
ws_hgo 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 wowglr 的回复:]
结贴先,琢磨一下再说,感谢大家!
[/Quote]
理解了没有啊
wowglr 2009-09-23
  • 打赏
  • 举报
回复
结贴先,琢磨一下再说,感谢大家!
wowglr 2009-09-23
  • 打赏
  • 举报
回复
37L

sp1234。。。。我虎躯一震,内牛满面啊。。。
wowglr 2009-09-23
  • 打赏
  • 举报
回复
刚下楼一趟

31,级联删除,比如删除部门后,直接删除掉该部门下所有人员吗?我一般用触发器来写,仍然可以不用外键。同时求教一下用外键的级联删除,谢谢

32,外键的意思和用法我明白。我只是不明白作用

33,如果没有外键呢?如果不合规范,阅读困难,其他呢?

34,嗯。规范很重要。

35, 是了
wowglr 2009-09-23
  • 打赏
  • 举报
回复
29。。。。

页面很多的话,确实是有点儿重复,但是好像一直都是这样写的

如果要等到数据库报错了才捕捉提示,太不友好了吧

能不能说一下你所谓的大项目中的这个地方,是?
implements2009 2009-09-23
  • 打赏
  • 举报
回复
我的心得是:
一、外键是用来防止生手乱删关联表中的核心数据而导致系统崩溃或程序异常的便捷手段。
二、给别人来维护你的程序时知道界面数据的来源是从哪些表中组合出来的。
程序漫步 2009-09-23
  • 打赏
  • 举报
回复
在小项目你是可以忽略外键。忽略数据库的规范。。

但是在大项目中 有些情况下 是往往控制不了,需要通过数据库 规范来约束。就像很多人说 三层里的 BLL有什么用一样。。。其实主要根据项目来定吧。。但我觉得养成这些良好的 习惯 才是最重要。。我们也是在不要不断的 规范自己,楼主是吗。。
liujintaozyc 2009-09-23
  • 打赏
  • 举报
回复
作为一种关联
用户表和订单表就是通过外键连接
说白了就是一个桥梁的作用 明白不
24K純帥 2009-09-23
  • 打赏
  • 举报
回复
外键是相对于表中的一个列给它的一个约束,一般是另一个表中的主键,该列的值必须在另一个表中出现;
一般是别的表的和这表有关系的主键作为外键
hoover8362 2009-09-23
  • 打赏
  • 举报
回复
不用外键怎么级联删除啊?
怎么搞,学习一下,^^
qq835311348 2009-09-23
  • 打赏
  • 举报
回复
我觉得26L表达得比较清楚,楼主可以好好琢磨一下
qq835311348 2009-09-23
  • 打赏
  • 举报
回复
有时候它就是这样的,当你经营到大项目的时候你就会体会到。现在你身不在其中,你是体会不到的,总之,如果你每次增删改查都要写一段代码去判断,然后给出提示,你不觉得这样很多重复吗?
wowglr 2009-09-23
  • 打赏
  • 举报
回复
26L

级联删除没有外键也是可以的吧

27

看了,也百度过好久,书面语看得头都大了。
chen_ya_ping 2009-09-23
  • 打赏
  • 举报
回复
我想一般的数据库原理书上都是有解释外键的吧,楼主可以看看
hoover8362 2009-09-23
  • 打赏
  • 举报
回复
数据库有实体完整性,参照完整性和用户自定义完整性.其中参照完整性指的就是主外键关系.
这种完整性有没有必要一定要有?没有必要.
但是如果没有,实体之间的参照关系就不好找,对业务逻辑就没有直观的认识。

比如老师和学生,你不建立关系,都相互独立,你就不知道他们之间会有怎样的联系。当然这个不用讲你也知道老师和学生是多对多的关系,但是换一个你不熟悉的领域呢?比如保单和保户之间有怎样的关系呢?

再就是建立这种关系,可以在技术上做些级联的动作,比如级联删除。

所以,虽然在技术曾面讲没有必要有外键,但是从业务角度来讲,应该有这样的关系的。就好象范式一样。
加载更多回复(25)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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