深入浅出级联删除
来源:互联网 发布:小明避税 知乎 编辑:程序博客网 时间: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,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 语句进行修改,似乎有点麻烦,是不是可以考虑用用其他的方法呢?试试触发器吧,关于触发器,请关注我下一篇博客!
- 深入浅出级联删除
- 级联删除
- 级联删除
- 级联删除
- 级联删除
- 级联删除
- 级联删除
- 级联删除
- 级联删除
- 级联删除
- 级联删除
- 删除级联hibernate级联删除
- 创建级联更新,级联删除
- mysql 级联更新 ,级联删除
- mybatis---级联保存,级联删除
- oracle级联删除
- Hibernate级联删除
- 级联删除等
- 367. Put the cart before the horse. 本未倒置
- 装修后才知道的79件事,无数网友真金白银砸出来的经验
- 网页设计第一章(第一课(2013-4-7))
- 央视《家有妙招》整理版,共250招,值得永远收藏
- MD5算法产生多少位的消息摘要?
- 深入浅出级联删除
- 第二节(文字标记color属性)
- 年月日级联
- SAS频数统计
- 房子小、智慧多,看了你再装修吧!(来不及看也要留着)
- SQL Server 日期相关
- WEB前端底层知识--浏览器是如何工作的(1)
- GetDeviceCaps()函数相关说明
- 开机禁止磁盘检查