多表关联,其中一个表删除记录,关联的表能自动更新吗?如果不能,SQL语句怎么写?

我在这儿等你 2014-01-13 09:43:32
我的项目中用到两个表,Table1和Table2,Table1是小表,有一百多条记录,Table2是大表,有几十万条记录。

Table1表的结构是 Table1-ID Table1-Name , 假设有100条记录,Table1-ID 从1到100

Table2表的结构是 ID Number1 Number2 Number3

Number1 Number2 Number3 是0或者Table1-ID,当删除Table1中某几条记录的时候,Table2中相关的记录能自动更新吗?如果可以,Number1 Number2 Number3 更新之后的值是什么?如果不可以,就要写SQL语句来更新,怎么写可以更高效呢?
...全文
264 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-01-21
  • 打赏
  • 举报
回复
类似的情景我以前做过,但是是有时间区间的,一旦有某个记录改了,就截断这个记录的结束日期,然后从修改的那天开始记录新的数据,这样保留一个历史记录,查询的时候使用where条件来控制区间
我在这儿等你 2014-01-21
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
[quote=引用 楼主 zgguoqing 的回复:] 我的项目中用到两个表,Table1和Table2,Table1是小表,有一百多条记录,Table2是大表,有几十万条记录。 Table1表的结构是 Table1-ID Table1-Name , 假设有100条记录,Table1-ID 从1到100 Table2表的结构是 ID Number1 Number2 Number3 Number1 Number2 Number3 是0或者Table1-ID,当删除Table1中某几条记录的时候,Table2中相关的记录能自动更新吗?如果可以,Number1 Number2 Number3 更新之后的值是什么?如果不可以,就要写SQL语句来更新,怎么写可以更高效呢?
可以用触发器来实现更新,但是如果几十万的表,频繁触发会有性能问题,或者你可以把整个逻辑包在一个事务中,比如:
begin tran 
select id into #t from table1 where xxxx--把你要删除的id预先存起来
delete from table1 where xxx--把这些ID删除

update table2 set xxxxx from #t  where xxxx --这里要怎么更新是你才知道了
--加上错误判断
commit
至于你这句:,Number1 Number2 Number3 更新之后的值是什么? 这是你应该告诉别人的,不是别人告诉你的,要效率的话就应该改设计,你的3个列都不知道对应table1的哪个列,这样就要全部判断,数据量一大,就没什么效率可言[/quote] 如果Number1 Number2 Number3相关的记录删除了,就更新成0,如果没有删除,就保留原值。我也觉得这种设计不太合理,怎么设计可以提高效率呢?
發糞塗牆 2014-01-21
  • 打赏
  • 举报
回复
引用 3 楼 zgguoqing 的回复:
[quote=引用 1 楼 shoppo0505 的回复:] 如果删除table1中的数据,table2中是不会自动更新的。 但是可以自己写代码更新。代码可以作为table1的触发器执行。 但是我写了这么长时间的数据库,没有见过这么设计的。 一般来说,你这么设计的话,table1是主表,table2是副表,表示主表中的数据关系。 只有当副表中数据删除了以后,才能删除副表数据。你这么设计的理由何在?
比如:Table1存储课程编号和课程名称,Table2存储学生选课情况,一个学生可以选择三门课,顺序是随机的。删除Table1中某些课程时就会出现这样的问题。[/quote]如果两表有外键关联,建议使用级联删除
我在这儿等你 2014-01-21
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
如果删除table1中的数据,table2中是不会自动更新的。 但是可以自己写代码更新。代码可以作为table1的触发器执行。 但是我写了这么长时间的数据库,没有见过这么设计的。 一般来说,你这么设计的话,table1是主表,table2是副表,表示主表中的数据关系。 只有当副表中数据删除了以后,才能删除副表数据。你这么设计的理由何在?
比如:Table1存储课程编号和课程名称,Table2存储学生选课情况,一个学生可以选择三门课,顺序是随机的。删除Table1中某些课程时就会出现这样的问题。
發糞塗牆 2014-01-14
  • 打赏
  • 举报
回复
引用 楼主 zgguoqing 的回复:
我的项目中用到两个表,Table1和Table2,Table1是小表,有一百多条记录,Table2是大表,有几十万条记录。 Table1表的结构是 Table1-ID Table1-Name , 假设有100条记录,Table1-ID 从1到100 Table2表的结构是 ID Number1 Number2 Number3 Number1 Number2 Number3 是0或者Table1-ID,当删除Table1中某几条记录的时候,Table2中相关的记录能自动更新吗?如果可以,Number1 Number2 Number3 更新之后的值是什么?如果不可以,就要写SQL语句来更新,怎么写可以更高效呢?
可以用触发器来实现更新,但是如果几十万的表,频繁触发会有性能问题,或者你可以把整个逻辑包在一个事务中,比如:
begin tran 
select id into #t from table1 where xxxx--把你要删除的id预先存起来
delete from table1 where xxx--把这些ID删除

update table2 set xxxxx from #t  where xxxx --这里要怎么更新是你才知道了
--加上错误判断
commit
至于你这句:,Number1 Number2 Number3 更新之后的值是什么? 这是你应该告诉别人的,不是别人告诉你的,要效率的话就应该改设计,你的3个列都不知道对应table1的哪个列,这样就要全部判断,数据量一大,就没什么效率可言
shoppo0505 2014-01-13
  • 打赏
  • 举报
回复
如果删除table1中的数据,table2中是不会自动更新的。 但是可以自己写代码更新。代码可以作为table1的触发器执行。 但是我写了这么长时间的数据库,没有见过这么设计的。 一般来说,你这么设计的话,table1是主表,table2是副表,表示主表中的数据关系。 只有当副表中数据删除了以后,才能删除副表数据。你这么设计的理由何在?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧