相关文章推荐
有腹肌的警车  ·  Traefik 3.x with ...·  4 周前    · 
成熟的橡皮擦  ·  删除死代码·  1 年前    · 
玩命的青蛙  ·  R-数据操作 - 王诗翔·  1 年前    · 
欢乐的砖头  ·  ORA-03135 Connection ...·  1 年前    · 
痴情的跑步机  ·  Merge branch ...·  1 年前    · 

外键的作用,主要有两个:
一个是让数据库自己通过外键来保证数据的完整性和一致性
一个就是能够增加ER图的可读性
有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败.他们觉得这样很麻烦
其实这正式外键在强制你保证数据的完整性和一致性.这是好事儿.

外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的“参照完整性”的数据库实现方式。

外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。
例如有两个表
A(a,b)   :a为主键,b为外键(来自于B.b)
B(b,c,d)   :b为主键
如果我把字段b的外键属性去掉,对编程没什么影响。
如上面,A中的b要么为空,要么是在B的b中存在的值,有外键的时候,数据库会自动帮你检查A的b是否在B的b中存在。

1、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。
2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个企业现有的数据库,里面的参照完整性约束有的是外键描述,有的是用触发器实现,感觉很明显。当然,文档里可能有,但是也可能不全,但是外键就非常明显和直观。
3、既然我们可以用触发器或程序完成的这个工作(指参照完整性约束),DBMS已经提供了手段,为什么我们要自己去做?而且我们做的应该说没有RDBMS做得好。实际上,早期的RDBMS并没有外键,现在都有了,我认为数据库厂商增加这个功能是有道理的。从这个角度来说,外键更方便。
4、关于方便,根据我带项目的情况来看,程序员确实有反映,主要是在调试时输入数据麻烦:如果数据可以违反参照完整性,那么就是说参照完整性本身就不对名誉业务冲突,此时也不应该用触发期货程序实现;否则,说明数据是错误的,根本就不应该进入数据库!而且,这也应该是测试系统的一个内容:阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。

最后说一下,建键几个原则:

1、 为关联字段创建外键。
2、 所有的键都必须唯一。
3、避免使用复合键。
4、外键总是关联唯一的键字段。

在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。
外键的使用条件:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

搞个例子,简单演示一下使用,做dage和xiaodi两个表,大哥表是主键,小弟表是外键:
建表:

CREATE TABLE `dage` (
auto_increment,
`name` varchar default PRIMARY (`id`)
) ENGINE InnoDB DEFAULT CHARSET latin1;
CREATE TABLE `xiaodi` (
外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的“参照完整性”的数据库实现方式。         外键属性当然是可以去掉的,如果你不想再用这种约束,对编程当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。       例如有两个表     A(a,b)   :a为主键,b为外键(来自于B.b)     B(b,c,d)   :b为
1.主键、 外键 的作用,索引的优点与不足? 答:主键:是表中的唯一标示键。作用:保证实体的完整性;加快数据库的操作速度;增加新的表记录时,数据库会自动检索新记录的主键值,不允许该值与其他表中记录的主键重复;数据库会按主键值的顺序显示记录,如果没有设定主键,则按输入的顺序显示记录。 外键 :是主键的从属,表示了两个表之间的联系。作用:使用 外键 可以避免冗余。 索引的优点: 1、通过创建唯一性的索引,可以保...
1、由数据库自身保证数据一致性,完整性,更可靠,因为程序很难 100% 保证数据的完整性,而用 外键 即使在数据库服务器宕机或者出现其它问题的时候,也能够最大限度的保证数据的一致性和完整性。(数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果增加了C应用呢)。 2、有主键的数据库设计可以增加 ER图 的可读性,这点在数据库设计时非常重要。 3、 外键 在一度程
使用过或者接触过数据库 外键 的开发者,有时候删数据就能够体会到一种欲生欲死的感觉,各种表关联,导致了要删某张表的数据就一定要先删除 外键 关联的那张表中对应的数据,一层层的删除下来,烦的一批。不过使用数据库 外键 也是有 好处 的,就是可以保证数据的一致性,不太可能出现垃圾数据,这几年开发下来,感觉使用Mysql数据库的公司大概率是不太喜欢用 外键 的,而使用Oracle的公司则相反。个人也是体会了一把 外键 删数据的酸爽,所以想分享下不使用 外键 有什么 好处 ? 使用 外键 是会影响性能的,因为要保持数据一致性,所以不用 外键 ,性能是会
正方观点: 1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用 外键 即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。 eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢
什么是 外键 ? 外键 ( foreign key ) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的 外键 。 为什么要使用 外键 ? 保证数据的参照完整性。 不用会怎样? 不用也不会怎么样,如果一个健壮的系统,数据库中的数据一定有很...
其中,`子表`是要创建 外键 约束的子表,`FK_ 外键 名`是 外键 约束的名称,`子表 外键 列`是子表中要与父表关联的列,`父表`是被关联的父表,`父表主键列`是要与子表 外键 列关联的父表主键列。 例如,如果我们要在`order_details`表中创建一个 外键 约束,将`order_id`列与`orders`表的`order_id`列关联起来,可以使用以下语句: ALTER TABLE order_details ADD CONSTRAINT FK_order_details_orders FOREIGN KEY (order_id) REFERENCES orders(order_id); 这样,当我们向`order_details`表中插入一条数据时,如果`order_id`列的值在`orders`表中不存在,就会触发 外键 约束失败的错误。