深入浅出级联删除

来源:互联网 发布:小明避税 知乎 编辑:程序博客网 时间:2024/05/29 18:02

首先,我们看一张具有主外键关系的表:


1,如果我们想要删除Recharge表中Id为5的数据,用SQL语句:

deleteRecharge where Id='5'

执行结果为:2行收影响----成功删除了Recharge表中Id为5的两条记录!

2.要删除Card表中的CardId为4的数据,SQL语句试试:

delete Card whereCardId ='4'

执行结果为:


结果有点悲催了,删除失败了.


3.再来删除StudentInfo表中StudentID为4的数据看看,SQL语句试试:

deleteStudentInfo  where StudentID='4'

执行结果:


又出错了,而且还是同样的错误呢,

有错误就得找出错误进行修改啊,想把成功删除Card表中的数据和StudentInfo中的数据,得先弄明白这些错误主要出现在什么地方.

在文章开头有一张图片,上面的三个表建立了主外键关系,那么问题就出现在主外键关系上.外键的主要作用就是保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中的列的值或使用空值.其实主外键关系就如同数学中的包含关系例如,两个数组A,B.A数组元素为1,2,3,4,5,6,7,8,9,AB的一个主键键,那么B数组的元素则只能是在1--9这个范围内.可以用一张图来表示:


那么这时我们就可以解释错误的原因了,那是因为在Recharg表中还有Card表中的相关连的数据,Card表中还有StudentInfo表中的数据,当删除的时候,在从表中相关联的数据无法删除,所以就会出现提示中的错误了.

那么,如果要删除StudentInfo表的某个数据,就要把相关联的数据一起删除掉,这是我们就可以使用级联删除的方法来实现了.

由于级联删除需要在建立外键的表中写级联删除的语句,所以我们就用SQL语句重新建立3张表,具体如下:

1.建立Student 表,因为是主表,所以未写级联删除语句:

create  table Student(StudentID int  primary key,  ---学号,主键StudentName varchar(20) not null, --学生姓名Sex varchar(4) not null  --性别)

表:



2.建立StudentCard表,这张表相对于Student表是具有外键表,相对于CardRecharge 表是主键表,因为有外键关系,所以需要写级联删除语句:

Create table StudentCard (CardID int primary key, --卡号,主键,外键Type varchar(10) not null,  --卡类型,1.临时用户,2固定用户Cash float not null,  --卡内金额foreign key (CardID) references Student(StudentID) ON Delete cascade  --级联删除语句)
表:



3,建立CardRecharge表,因为该表具有外键关系,所以需要写级联删除语句!

Create table CardRecharge (Id int not null,  --卡号,外键ReCharge float not null,  --充值金额date date not null, --充值日期foreign key (Id) references StudentCard(CardID) ON Delete cascade ---级联删除语句)

表:



三张表建立好了,填充完数据之后,我要删除Student表中StudentID ='3' 的数据,用SQL 语句:

delete Student where StudentID ='3'

就可以轻松的搞定了!


从上面的例子中,我们可以得出的结论为:

1.级联删除的作用:删除包含主键值得行的操作,该值由其它表的现行中的外键列引用.在级联删除其外键值引用删除的主键值得所有行.简单的一句话就是删除主表同时删除从表(同时删除具有主外键关系的表的数据).

2.级联删除语法:

Foreign Key(column[,...n])references referenced_table_name[(ref_column[,...n])][on delete cascade][on update cascade]

注释:

column:列名

referenced_table_name:外键参考的主键表名称

ref_name:外键要参考的表的主键

ondelete:删除级联

onupdate:更新级联

          使用级联删除可以删除具有主外键关系的表的相关联的数据,但是级联删除语句需要写在建立表的语句块中.如果已经建立好了数据表,想要使用级联删除的哈,要对表建立的SQL 语句进行修改,似乎有点麻烦,是不是可以考虑用用其他的方法呢?试试触发器吧,关于触发器,请关注我下一篇博客!


原创粉丝点击