sqlserver两张表数据联级删除问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver两张表数据联级删除问题相关的知识,希望对你有一定的参考价值。

假设现在有两张表,一张是班级表Class(记录班级的基本情况,不包含学生信息),还有一张是学生表Student(班级表的ID号classid是这张表的外键)。现在我需要删除班级信息时,对应的学生信息也一起跟着删除。对应sql代码为——删除5班学生信息:delete from Student where classid=5。 删除5班班级信息:delete from Class where classid=5。但是问题是,如果前一句执行成功,而后一句执行出错,岂不是学生信息没有了,但班级信息还在吗?我想问如果两句语句写一起:“delete from Student where classid=5;delete from Class where classid=5”,若执行时发生错误,会自动回滚吗?如果不能,那怎么样才能在某一句语句执行出错时,让数据库rollback。用事务?触发器?on cascade?请具体一些,最好能以我的例子为例,写出相关语句。十分感谢!!!

给你做个简单试验吧

 

创建class表,里边其他字段我就略了

create table class(classid int not null primary key,
classname varchar(20))

创建学生表

create table student(studentid int not null primary key,
studentname varchar(10),
classid int)

 

添加外键级联删除或更新约束

alter table student add constraint FK_classid foreign key (classid) references class (classid) on update cascade on delete cascade

 

向class表增加数据

insert into class values (1,\'1班\')
insert into class values (2,\'2班\')

向student表增加数据

insert into student values (1,\'aa\',1)
insert into student values (2,\'bb\',2)
insert into student values (3,\'cc\',3) --这条是增加不进去的,会报错

删除class表里一班的数据

delete from class where classid=1

检查 student 表里数据

这个时候你就发现,为1班学生的那数据也同时被删了

参考技术A 放在事务里面执行
BEGIN TRANSACTION

delete from Student where classid=5
delete from Class where classid=5

IF @@ERROR > 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

sql server数据库怎样同时删除两张表的数据

两张表有主外键关系,不用存储过程、创建级联删除、触发器就用一条sql语句。请各位指教,谢谢!

1、打开SQL Server 2008 并连接一个数据库。

2、点击工具栏的“新建查询”按钮,新建一个查询。

3、这个数据库里有个测试表格,里面有7条记录。输入“DELETE * FROM * FROM 测试;”

4、执行“DELETE * FROM * FROM 测试;”软件提示错误。

5、去掉DELETE后面的*号,改为:

DELETE FROM 测试;

执行显示“7行受影响”,也就是之前的7条记录全部被删除了。

6、然后执行SELECT * FROM 测试;查询结果为空,再次验证已删除表格“测试”中的所有记录。

参考技术A 解决办法:
1、在设计数据库表时,通过设置级联删除操作来完成。
2、可以写触发器完成操作。
3、先删除主表的数据行,然后根据关联的外键值来删除附表中的相应行数据即可。

具体方法:
作为外键暂且叫它主表,Delete from Main Where id=@id
则要先删除子表当中 Delete from Detail where MainId = @id
为了保证数据完整性,最好将上面的操作包含在一个事务中,如果两个语句影响的行数都大于零,则提交,否则回滚。
参考技术B 主表:Parent,子表:Child,关系:Parent.ID = Child.ParentID
1、同时删除两个表中的所有数据:先子表,再父表,使用外连接(父表可能仍有数据)
DELETE * FROM Child RIGHT JOIN Parent
ON Child.ParentID = Parent.ID;
2、同时删除两个表中符合某个条件的数据:先子表,再父表,使用内连接
DELETE * FROM Child INNER JOIN Parent
ON Child.ParentID = Parent.ID
WHERE 条件子句...;追问

right 附近存在错误,还有就是delete后面不能出现* 或字段,因为我们删除就是删除一行记录。

追答

@^_^@ 有一阵子没有写SQL了!
DELETE 后只能跟一个数据表名,所以上面给出的两个语法都是错误的。
DELETE不能对数据记录集进行操作(如使用子查询返回的结果集),因为一旦涉及两个以上的表,会有级联等问题,单纯的DELETE语句是无法应付这种复杂情况的。
不使用楼主给出的三个条件条,同时删除两个表的数据是比较困难的。
当然,如果写一个函数来处理此事,再用EXECT语句执行该函数,是可以达到要求的,但这除了钻牛角以外,没有太大的意义! 呵呵!到此为止吧。

本回答被提问者和网友采纳
参考技术C --a_table 主表
--b_table 从表
alter table b_table
add constraint fk_b_table_b字段 foreign key(b字段) references a_table(a字段)
on delete cascade

delete from a_table where 条件
参考技术D 为什么非得一条呢 是考试吗 不解追问

考试中有这样的问题,想知道解决方法。

追答

我觉得应该是考察 两个具有主外键关系的表 需要先删外键表 再删主键表吧
一条语句 确实没用过 一起学习

以上是关于sqlserver两张表数据联级删除问题的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer两张表筛选相同数据和不同数据

SQLServer两张表筛选相同数据和不同数据

SQL Server中 两个不同的数据库中的两张表如何关联?

SQLSERVER中如何快速比较两张表的不一样

SqlServer2008 如何判断一张表的数据不在另外两张表里且在该表中新建一列显示状态

数据库中两张表之间的数据同步实现思路(增加删除更新)Mysqlsqlserver