最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键。

数据库约束是为了保证数据的完整性而实现的一套机制,它具体的根据各个不同的数据库的实现而有不同的工具.
一般来说有以下几种实现方式:
1、检查约束:
通过在定义数据库表里,在字段级或者是在表级加入的检查约束,使其满足特定的要求.
比如以下的表定义:
CRATE TABLE student(
id serial,
name varchar(10),
scrore integer CHECK (scrore > 0));
定义分数不能小于0.
也可以在表级定义:
CHECK (字段1的条件(比如 字段1>100)
2、非空约束:
这个大家应该很熟悉了.直接在字段后面加上:NOT NULL.
3、唯一约束:
定义一个唯一约束但是它并不包括NULL值.直接在字段定义后加入UNIQUE即可定义一个唯一约束.
4、主键约束:
SQL 92建议在建立一个表时定义一个主键:它其实就是:唯一约束+非空约束.
5、外键:
所有约束里数这个约束最有意思了:比如说有这样一件事,你需要做一个学生查询的网页.那么为了方便,你将建立三个数据表:
一个是学生情况表:
CREATE TABLE student(
id serial primary key,
name varchar(10),
.
);
一个表是记录所开的课程
CREATE TABLE class(
class_id varchar(5) primary key,
describe varchar(20)
.
);
一个表是记录学生成绩的表:
CREATE TABLE score(
id integer references student,
class_id varchar(5) references class,
score integer CHECK (score > 0)
);
这个时候你会发现以下几件事:
如果你在成绩表里输入不存在的学生和课程,数据系统将拒绝.如果你要删除一个学生,但是他已经在成绩表里有记录,数据库将拒绝删除这个学生的记录.
那么我们现在来看,前面一个对我们是有利的,因为谁都不想一个学生无缘无故的有了一个成绩的记录,但是在删除的时候就会比较麻烦了,有时候我的确是想删除这个学生.那么我总不能在应用程序里照顾得那么周到吧.不要紧我们在定义数据表的时候只在外键那一样加入以下控制就OK了,我们来重新定义数据表
score
CREATE TABLE score(
id integer references student ON UPDATE CASCADE ON DELETE
CASCADE,//我们希望在学生记录改变时自动改变分数记录,在删除学生级联删除分数记录
class_id varchar(5) references class ON UPDATE CASCADE ON DELETE
RESTRICT,//我们希望在改变课程时自动改变分数记录表里关于课程的引用,但是不希望删除课程时级联删除分数.
.
);
这样我们就可以很好做到数据完整了.

MySQL外键是MySQL数据库中非常重要的部分,那么,MySQL外键究竟起到哪些作用呢?下文就将带您一探其中的秘密。

  外键的作用:

只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持外键约束

 

MySQL外键的作用:

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

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

 外键:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。
使两张表形成关联,外键只能引用外表中的列的值!
例如:
a b 两个表
a表中存有 客户号,客户名称
b表中存有 每个客户的订单
有了外键后
你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x

  例如:

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

 如果显示这种错误是什么原因?

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

  a b 两个表

两个表必须是InnoDB表类型。使用在外键关系的域必须为索引型。使用在外键关系的域必须与数据类型相似

图片 1

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

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

指定主键关键字: foreign key

分析:

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

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

引用外键关键字: references 事件触发限制:on delete和on update ,
可设参数cascade, restrict,set Null,set Default,[默认]no action

 1、看看主键 和 外键 的 数据类型 是不是设置的不一样

事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动),
restrict(限制外表中的外键改动),set Null(设空值),set
Default设默认值),[默认]no action

  有了外键后

outTable表 主键 id 类型 int

2、设置ref为外键,两个必要条件:一.ref不能为该表的主键;二.ref所参考的键必须为表的主键,所以添加主键约束即可。

例如:

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

复制代码 代码如下:create table
temp,foreign key references outTable on delete cascade on update
cascade);

3、ref的值需要在所参考的表的那一个主键中已经存在了,因此删除不符合的数据或者删除全部数据或者到被参考的表中添加相应有效的数据即可。

outTable表 主键 id 类型 int

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

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

 

创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update
cascade);

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

复制代码 代码如下:create table temp( id
int, name char references outTable on delete cascade on update cascade);

(1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持外键约束

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

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

缺点:在对MySQL做优化的时候类似查询缓存,索引缓存之类的优化对InnoDB类型的表是不起作用的,还有在数据库整体架构中用得同步复制也是对InnoDB类型的表不生效的,像数据库中核心的表类似商品表请大家尽量不要是使用外键,如果同步肯定要同步商品库的,加上了外键也就没法通不了,优化也对它没作用,岂不得不偿失,做外键的目的在于保证数据完整性,请大家通过程序来实现这个目的而不是外键,切记!

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

MySQL定义外键的方法

  事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动),
restrict(限制外表中的外键改动),set Null(设空值),set
Default(设默认值),[默认]no action

相关文章