数据库mysql
建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。
外键作用: 使两张表形成关联,外键只能引用外表中的列的值!
指定主键关键字: foreign key(列名)
引用外键关键字: references <外键表名>(外键列名)
事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action
例如:
outTable表 主键 id 类型 int
创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。
自己实践 才能完全了解外键的作用 关键是:事件触发限制的作用
设置外建的时候加上:on delete cascade on update cascade
如:create table tablex
(....
.....
FOREIGN KEY(id)REFERENCES tabley(id) on delete cascade on update cascade
);
X表删除,Y表关联字段也自动删除
主键是本张表的主键,是唯一且非空的,而外键是另一张表中与这张表的某个字段的类型,字段名相同的字段,一般是用作关联两张或两张以上的数据表时用的。
以下面三张表为例:
有三张表,一张表是读者信息,有一个属性为readno,一张表是图书的信息,有一个属性是bookno,一张表是借阅关系,有两个属性分别以读者信息表中的readno,和图书信息表中的bookno为外键,我想问的是,在借阅关系表中插入数据时不是得自己写入readno和bookno吗,这样,设外键还有什么作用?
外键取值规则:空值或参照的主键值。
(1)插入非空值时,如果主键表中没有这个值,则不能插入。
(2)更新时,不能改为主键表中没有的值。
(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
(4)更新主键记录时,同样有级联更新和拒绝执行的选择。
简言之:
起约束作用,就是在借阅关系表中只能插入读者/图书信息表中存在的值
不然会出错.
作用在于如果你插入的readno或者bookno在两个表中没有,就会插不进去
下面是我从SQlservr2000里面导出关系表部分:
主键:UsrName.id
外键:Age.usrid
CONSTRAINT [FK_Age_UsrName] FOREIGN KEY
(
[usrid]
) REFERENCES [dbo].[UsrName] (
[id]
) ON DELETE CASCADE ON UPDATE CASCADE
--例如
create table zb --主表
(
zb_id int primary key,
)
go
create table cb --从表
(
cb_id int primary key
FOREIGN KEY REFERENCES zb(zb_id) ON DELETE CASCADE , --指定级联删除
)
go
--主表数据
insert zb values(1)
insert zb values(2)
insert zb values(3)
--从表数据
insert cb values(1)
insert cb values(2)
insert cb values(3)
select * from zb
select * from cb
zb_id
-----------
1
2
3
(所影响的行数为 3 行) mx_id -----------
1
2
3
(所影响的行数为 3 行)
--级联删除
delete from zb where zb_id = 1
select * from zb
select * from cb
zb_id
-----------
2
3
(所影响的行数为 2 行)
mx_id
-----------
2
3
(所影响的行数为 2 行)