首先,我们看一张具有主外键关系的表:
1,如果我们想要删除Recharge表中Id为5的数据,用SQL语句:
deleteRecharge where 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,A是B的一个主键键,那么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 语句进行修改,似乎有点麻烦,是不是可以考虑用用其他的方法呢?试试触发器吧,关于触发器,请关注我下一篇博客!