如何在MS Access中基于Abonament表日期删除Client与关联表记录?
解决Access中关联表同步删除的问题
你遇到的问题很常见——Access默认不会自动删除关联表的记录,除非你开启了级联删除的关系设置。我来一步步帮你解决:
一、先恢复(如果可行),再用级联删除一次性搞定
如果你还能找回刚才删除的Abonament表记录(比如有备份或者还没保存数据库),建议先恢复,然后按下面步骤操作:
开启级联删除关系
- 点击Access顶部工具栏的「关系」按钮,打开关系窗口
- 要是窗口里没显示Client和Abonament表,右键空白处选「显示表」,把两个表加进来
- 从Client表的
client_id字段拖到Abonament表的client_id字段,弹出「编辑关系」窗口 - 先勾选「实施参照完整性」,接着勾选「级联删除相关记录」,最后点确定保存
执行删除操作
现在你再删除Abonament表中data_expirarii ≤ #06/01/2017#的记录时,Client表中对应的client_id记录会被自动同步删除,不用再手动处理了。
二、如果已经无法恢复Abonament的记录,补删Client表的对应数据
要是Abonament的记录已经找不回来了,那得根据你的数据情况选方法:
方法1:用备份表筛选删除(如果有备份)
如果你之前给Abonament做过备份(比如叫Abonament_Backup),可以直接用SQL语句删除Client中对应的记录:
DELETE Client.* FROM Client WHERE Client.client_id IN ( SELECT client_id FROM Abonament_Backup WHERE data_expirarii <= #06/01/2017# );
执行前记得先备份当前数据库!
方法2:删除所有无对应Abonament记录的Client(谨慎使用)
如果这些要删除的Client本来就只关联了你刚才删掉的Abonament记录,现在它们在Abonament表中已经没有匹配项了,可以用左连接来删除:
DELETE Client.* FROM Client LEFT JOIN Abonament ON Client.client_id = Abonament.client_id WHERE Abonament.client_id IS NULL;
⚠️ 注意:这个语句会删掉所有在Abonament表中没有对应记录的Client,要是有本来就没关联Abonament的Client,也会被删掉,一定要确认后再执行!
重要提醒
不管用哪种方法,执行删除操作前一定要备份整个数据库,避免误删重要数据。
内容的提问来源于stack exchange,提问作者t1f
相关产品推荐
相关产品推荐

