简简单单说外键和级联

上一篇 / 下一篇  2012-06-15 09:03:44 / 个人分类:数据库

 ● 外键
TB^+]9W5u\Ll0    ○ 定义51Testing软件测试网\z ]7]2} pI#W8zwpF
    ○ 作用
3K)t$PVAZuF d-|.\5q0    ○ 主表和从表
G0X'C8yIL0    ○ 建键原则
j'Vs/W5h'T-K!bE#MA0    ○ 事件触发限制

$p*k1Bp/j kh;C0  ● 外键简单实例

GH*}{`051Testing软件测试网 hS3{n3l9Au]k0l

  ● 触发器实现51Testing软件测试网 ML H;dHou
    ○ 建表语句
nB*UtxW"k {~;P^?0    ○ 关系说明51Testing软件测试网r2twM#C_hpl]
    ○ 实现级联删除
51Testing软件测试网3?4AeI2`

51Testing软件测试网"iX,Q+q GS

  ● 更改设置实现

z Mv~c.lmu0

2b.?Q)Y!j| E1yS0  ● 总结51Testing软件测试网`y4`)k3Q L l

51Testing软件测试网,[S!JXf$Ls

  文首

x,z ^%_3ydj:r051Testing软件测试网:Qm,rOr h@.I

  今天给考试系统添加学生信息失败,原因是student与classes表有级联关系,作为从表的student表不能随意添加,这些都学过却还没怎么用过,借这次机会学习一下。51Testing软件测试网~j7l4|8I9e#~+i2j

5K7IU,j3q%fJ3Ih0  外键

;pf H%J D!\L9z/b051Testing软件测试网5P+]|a1P[g+L,u`

  说到级联删除不得不先说一下外键,外键的定义:“如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键;换而言之,如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键”。51Testing软件测试网H5EI:JSLt ?w bP

JP8i2JZ#]0  建立外键的sql语句:

[ F%o6c*R|S0
foreign key(idB) references A(idA)
51Testing软件测试网_1l1I!WP4I

  从语法分析也可以看出:外键是一种表之间字段值的引用关系。

,yL5K0v8Y7rL0B1K f4m ^051Testing软件测试网E([ Z8lB8Di

  主表和从表

*I6FQE?#u051Testing软件测试网;E6Kn"n([\D\

  主表和从表:以另一个关系的外键作主关键字的表被称为从表,具有此外键的表被称为主表。说白了就是:主表是被引用的表,外表是引用其他表的表。

.i1z5@nA5z!E0

,Q^~ n0K,@0  那么外键有什么作用?外键作用可以说是:保持数据一致性,完整性,关联性,主要目的是控制存储在外键表中的数据。就是当你对一个表的数据进行操作,和他有关联的一个或更多表的数据能够同时发生改变,避免无效或是无用的改变和孤立的数据。51Testing软件测试网cXX d$tH

m#JF2?b\uI.y!qr F k0  建键原则:51Testing软件测试网v*Fv1r^.w(K

51Testing软件测试网4if5u/or9QrNn

  1、外键字段为主键51Testing软件测试网$UYC[UbD

51Testing软件测试网d)T Q:BnLf#T3e-Z

  2、所有的键都必须唯一51Testing软件测试网 ^r/_EuZM?

q"^ F7u j A0  3、避免使用复合键

9n(@cx8vc0

AK3h8w"P]I0  4、外键总是关联唯一的键字段

,p/R$d2G)Z]c051Testing软件测试网p\Q*JgBq8z'b

  外键约束事件触发。既然有外键约束,当违反约束时会发生什么?我们把它的反应看作事件,一共有四种:

6ENAt3C O051Testing软件测试网t ?!r _/|r0qaf

  1、级联:当主表更改时,从表跟从更改。51Testing软件测试网1N9rhY$Ta L

U5yj0S/u1_.J6bm[t^0  2、不执行任何操作。51Testing软件测试网.l[R8L OQj

51Testing软件测试网$Qg+J*J}4fD:[

  3、设置null。51Testing软件测试网6p#p8uj'FLUZel!^

[q"w)a7i0  4、设置默认值。

|s H;X:Q0

$\&]@(?MT'V~8m.h,{Y0  我的看法51Testing软件测试网BV7w)L S~7Vkc

zD,mSp@l0   这些听着挺玄,我说说自己的看法:主表、从表和外键的定义:我把我的笔记本借给你用,可以把“我”当作是主表、“笔记本”当作外键、“你”当作从表,就 是说“你”在使用(引用)“我”的“笔记本”;外键的作用就是:现在你想把我的笔记本卖了扔了送人(增加更新删除等),得看看我允许不允许,我想搬家走 人,你不把笔记本还给我,我不能搬;建键原则:借之前首先咱得说好了,我只有这么一台笔记本,你也最好是也只借了我这台笔记本,避免你也借了别人的笔记 本,不知道哪个是我的了。事件触发:我说你赶紧把笔记本还给我,你可以选择还给我,可以选择不搭理我等。总而言之,由于这笔记本,“你”和“我”关联起 来,这台笔记本怎么样,不能一个人说了算。51Testing软件测试网W6cX%x|-n&p U

[0GL#nmW0简单实例

#XK3V}A1dpd'c0

t [9EMt1^0jZ4MM#X"[0  说了这么多,咱先说个简单的实例:建立两个表t_main和t_branch,并设置外键。语句的意思是t_main中的id是t_branch 的外键。

f:\7p Y$~'x#N@+j-l:~;o051Testing软件测试网(E5X-F(F vM"EW:H

&g3Ljl\`0
create table t_main51Testing软件测试网)_~.@9e j7A
(
#OPH;r4yI;|!O(qp0  id int primary key,
G)X\QQ8H?_+j*d5w0  [content] varchar(100) not null51Testing软件测试网?0TtE8T*Zd!I9S
 
ESypA0)
4`3Hd$W7^ Cf0create table t_branch51Testing软件测试网3Xo6Y-U!g+TD
(
N}~,{ `0 mainId int Primary key ,51Testing软件测试网_7D.tzA!NE?h
 [content] varchar(100) not null,
r5GXlv~'xD0 foreign key(mainId) references t_main(id)
!^)nCT @"m0)
51Testing软件测试网ro1?Td5q'Lz'Y

  执行语句,现在我想直接在t_branch中插入一条数据insert into t_branch values(3,'分支表'),提示如下:INSERT 语句与 FOREIGN KEY 约束"FK__t_branch__mainId__4F7CD00D"冲突。该冲突发生于数据库"beidaqingniao", 表"dbo.t_main", column 'id'。

6^*Mg(b-[U~ T:b_0

9n!U4f8Ql&[~.C0  我想删除t_main语句drop table t_main,提示如下:无法删除对象 't_main',因为该对象正由一个 FOREIGN KEY 约束引用。

`~(o z'? q!v(YQ v0

l DT9P-\j1mvp0  在这两个表中,该外键的作用是,t_main中没有的外键值t_branch不能插入,而t_branch 正在引用t_main所以也不能只先删除t_main,否则t_branch中的数据会被孤立。我觉得,外键对主表的作用更倾向于不能删除,而对从表的作 用更倾向于不能随便添加。51Testing软件测试网+oc#EuU3JL|I

'c.~+tr,xe0  级联删除

+PRF~ubvH9l%e051Testing软件测试网t3N8_2Q,UPC

  但是如果想级联删除怎么办?总结出三种办法。51Testing软件测试网2Q3@ g%W;U0^1q1S+RY

51Testing软件测试网f2d$a;W!c;m

  sql语句修改设置:因为默认的外键触发是“不执行任何操作”,所以我们可以使用sql语句更改设置:

s C s,wC:B;O1[;BE#z^051Testing软件测试网@C6LG wP:p

(uU Y(M6\9I x;T5v0
FOREIGN KEY(id)REFERENCES tabley(id) on delete cascade on update cascade

U }qz*I:R[0  意思是从表会跟随主表的改变而改变。

S8B9v$~em1`3S9`Q0

${{;{ dq@^A(G0  可视化修改:不想写代码,也可以可视化操作,新建数据库关系图,选择主表和从表添加,其关系也会自动添加。选择主表或从表---右键---关系---insert和update规范---级联。如图:

,G-P;UX:w0

qH%wlD6{\U3n$?0

  当然也可以使用触发器,触发器的基础知识,欢迎访问我的博客《详解sql中的触发器

:k9ub*f1q9vPM0

51Testing软件测试网9ov;T;T4Tba)D#i

-- =============================================51Testing软件测试网(d3W6tr(t ]Q2p _7u
-- Author:  李达 
*y\NW:W(}0-- Create date: 2012年6月10日 18:11:4651Testing软件测试网 } `Scf0^6uU
-- Description: 简单的级联删除51Testing软件测试网d Y:[*jTMH
-- =============================================
}@iv:[e,R{6A0ALTER TRIGGER [dbo].[trigCascadeDelete]    --触发器名
+_ \!Q9rj?1RX0   ON  [dbo].[main]      ---作用于哪张表51Testing软件测试网'?R9xr^\$U FK
   instead of  delete    ---什么动作触发
:d/O LD` Rb0AS51Testing软件测试网eYge@^0o
BEGIN51Testing软件测试网 \I"AUp;l;\m!o q
 declare @id int   --声明@id变量51Testing软件测试网 O{oV[
 select @id=id from deleted --取出要删除的id
b$D)ENG9v$a"j$}0 delete from branch where mainId=@id  --先删除从表中的数据行
n)CC!Kg*HA m,{H0 delete from main where id=@id   ---再删除主表中的数据行
u&S)B)lz6I I%{ F%f0END

  总结51Testing软件测试网 SO:v6o ^0YC#Dy/N

  看过的知识不是你的,学过的知识不一定是你的,只有总结、运用后,才能更好的掌握知识,眼高手低的结果就是纸上谈兵。

P w3xOD1|K3SB0

TAG:

 

评分:0

我来说两句

Open Toolbar