深入浅出级联删除

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

深入浅出级联删除_第1张图片

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这个范围内.可以用一张图来表示:

深入浅出级联删除_第2张图片

那么这时我们就可以解释错误的原因了,那是因为在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 语句进行修改,似乎有点麻烦,是不是可以考虑用用其他的方法呢?试试触发器吧,关于触发器,请关注我下一篇博客!


你可能感兴趣的:(深入浅出级联删除)