SQLServer中多表删除的技巧
为了实现一个简单的删除,折腾了我一上午.情况如下:
我有两张表,一张是车辆信息表(LOG_Vehicle_Info),一张是车辆附加信息表(LOG_Vehicle_Extra_Info)表.在车辆信息表里,每一条记录都有在车辆附加信息表里有着一一对应的附加信息.他们之间的关系是一对一的关系.车辆附加信息PK为EV_Id,在车辆信息表中有FK(EV_Id).
现在需要对特定的车辆信息进行删除,当然,该信息所对应的附加信息也得要删除才行.
原始方法:
为了删除附加信息表中记录,我们需要知道附加信息的ID编号,但这个编号我们只能通过车辆信息表才能找到,所以实现方法如下:
通过车辆号码(车辆信息表的PK)查询出需要删除的车辆的附加信息ID编号(EV_ID),然后做两次删除.因为现在我们知道了附加信息表的的主键EV_Id.
为了实现删除这一操作,我需要向数据库执行一次查询,然后通过查询的结果作为条件进行两次的数据库删除,为了得到查询结果,C++代码就有好几行,所以这种方法不但麻烦而且效率还不高.
最新方法:
介绍这种方法之前,需要说明一下外键的概念,"外键主要功能是为了加强两表中的一行或者多行之间的联系,数据库中,它使数据保持完整性,即:同一数据,在不同的地方引用,当这一数据作相关的改变后,那么引用他的所有数据都会自动同步.",所以有了外键就好办多了,而且这一切都是数据库系统自动完成的,不需要我们过多的干预.
这里我的思想是,由于车辆附件信息表中的主键EV_Id是车辆信息表中的外键,那么只要删除了车辆附加信息表中的内容,那么所有在车辆信息表中引用该记录的行将会被数据库系统自己删除.
SQL语句如下:
DELETE [LOG_Vehicle_Extra_Info]//注意是删除车辆附加信息表,而不是车辆信息表 FROM [LOG_Vehicle_Info] WHERE LOG_Vehicle_Info.EV_Id = LOG_Vehicle_Extra_Info.EV_Id AND LOG_Vehicle_Info.Vehicle_CardNo= 'vvv'
删除车牌号为vvv的车辆信息.
要注意这里的语法:
DELETE [LOG_Vehicle_Extra_Info]//注意是删除车辆附加信息表,而不是车辆信息表 FROM
我们删除车辆附加信息表,这样,一旦在车辆信息表中的外键EV_Id的记录不存在的话,那么数据库系统将会自己删除该记录.如果我们
DELETE [LOG_Vehicle_Info]//是删除车辆信息表,而不是车辆附加信息表 FROM
这样写,那么我们只是删除了车辆信息表中的记录,而它所对应的附加信息依然存在,由于我们只是删除引用附加信息的表的记录,而不是删除了附加信息的记录,因为这里并没有破坏数据的完整性定义,所以数据库系统不会去删除附加信息表的.
技巧:在们删除多表时,我们只需要删除关联数据表,那么所有引用此关联数据表所对应表的记录将会被系统自动删除.
机器人 2007年7月26日 于 北京 (困死了,马上就去睡午觉)











