外键的作用,主要有两个:
一个是让数据库自己通过外键来保证数据的完整性和一致性
一个就是能够增加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`表中不存在,就会触发
外键
约束失败的错误。