关联表记录的删除操作

发布时间 : 星期六 文章关联表记录的删除操作更新完毕开始阅读

1. 关联表记录的删除操作

关联型数据表通过外键关系表示相互关联,比如会员等级和会员、会员和会员积分、积分日志、地区表(自关联)、文章分类和文章、商品分类和商品等,因此在系统中关联型数据表是非常常见的形式,掌握好对关联型数据表的处理至关重要。

根据业务需求的不同,对于关联型数据表的数据删除也采用不同的策略,通常有3种方式:级联删除、限制删除、置空或重置为缺省值。

级联删除

以会员和会员积分日志为例,会员积分日志通常需要选定一个会员,查看该会员的日志信息,当该会员记录被删除时,积分日志就没有查看的入口,称之为“垃圾”数据。因此在删除会员时,同时也把该会员的积分日志也删除。

限制删除

以会员等级和会员为例,在本系统中,会员等级包含了根据积分自动计算会员等级的非特殊会员组,非特殊会员组与会员不是关联关系,此处会员等级仅指代特殊会员组。当会员等级被删除时,可以删除属于该会员等级的会员吗?显示不能,而且是相当危险的一种行为,会员信息的丢失,属于网站的重大工作事故。

如何解决会员等级的删除呢?解决思路是:如果没有属于此会员等级的会员,那么删除该会员等级对系统就没有任何影响了,所以在删除会员等级时,需要检查会员表是否有属于此会员等级的数据,如果没有,则允许删除,否则限制删除。

直接提示不能删除,显然对用户不是很友好,如何能提高友好性呢?做为课外题,大家可以思考一下。

置空set null/重置为缺省值set default

置空是删除数据时,将关联数据表的外键设置为null或者为缺省值。置空也是保留关联数据的一种方法,通常用于外键可以不设置或者对于未设置的数据有相关处理,比如QQ的好友和组,好友可以分配到特定组里,未分组的好友都在“我的好友”里,当删除组时,并不会删除组里的好友,好友会在“我的好友”里显示。

了解了关联数据的删除逻辑后,怎样实现呢?方法有很多,这里介绍2种方式:通过外键约束和删除关联表的SQL语句。

外键约束:

大部分DBMS都支持外键约束,Mysql中只有Innodb类型的数据表才支持,创建表时通过建立外键,并设置约束方法。

MySQL创建关联表可以理解为是两个表之间有个外键关系,但这两个表必须满足三个条件:

1. 两个表必须是InnoDB数据引擎

2. 使用在外键关系的域必须为索引型(Index) 3. 使用在外键关系的域必须与数据类型相似 Mysql创建关键表的示例(图书馆借书和成员): Create TABLE IF NOT EXISTS `books` (

`book_id` smallint(6) NOT NULL auto_increment COMMENT '书籍编号', `book_name` char(20) NOT NULL COMMENT '书名', `book_borrower` char(7) default NULL COMMENT '借阅者', `book_borrower_time` date default NULL COMMENT '借阅时间', PRIMARY KEY (`book_id`), INDEX (book_borrower)) ENGINE=InnoDB;

Create TABLE IF NOT EXISTS `parts` (

`part_id` smallint(6) NOT NULL COMMENT '成员编号', `part_name` varchar(6) NOT NULL COMMENT '成员名', `part_mail` varchar(50) NOT NULL COMMENT '邮箱', `part_pass` varchar(20) NOT NULL COMMENT '密码', PRIMARY KEY (`part_id`),

FOREIGN KEY(part_name) REFERENCES books(book_borrower) on delete cascade on update cascade) ENGINE=InnoDB

分析一下books表和parts表,选择InnoDB为表引擎。而 parts表的part_name字段为外键,关联到books表的book_borrower字段.注意两个字段分别是char和varchar都是字符串类型。on delete cascade意思为当books表有相关记录删除时,那parts表也会跟着删除相关联的记录. 理论上parts表的part_name字段也应该要创建索引才对,但实验证创建关联后自动索引了.

不同DBMS支持的约束不同,Mysql 5.0支持cascade(级联操作)、restrict(限制操作),不写约束条件表示不进行任何操作(垃圾数据)。

与on delete(删除操作)对应的还有on update(当关联主表的关联字段内容更新时)的处理,请大家思考其中的业务逻辑。

Sql语句删除多表数据 1、 通过多条SQL语句删除

先删除子表数据,再删除主表数据,为保证数据完整性,通常启动事务来处理,如果要支持事务,也需要InnoDb的数据表类型。

2、 在一条SQL语句中删除 delete 语法:

DELETE [LOW_PRIORITY] [QUICK] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT rows] or

DELETE [LOW_PRIORITY] [QUICK] table_name[.*] [, table_name[.*] ...] FROM table-references [WHERE where_definition] or

DELETE [LOW_PRIORITY] [QUICK]

FROM table_name[.*] [, table_name[.*] ...] USING table-references [WHERE where_definition]

示例代码: 1. 删除一个表中的数据 delete from department where name='Asset Management'; 2. 删除两个表中的数据 delete employee, employeeSkills from employee, employeeSkills, department where employee.employeeID = employeeSkills.employeeID and employee.departmentID = department.departmentID and department.name='Finance'; 3. 删除两个表中的数据,用using语法 delete from employee, employeeSkills using employee, employeeSkills, department where employee.employeeID = employeeSkills.employeeID and employee.departmentID = department.departmentID and department.name='Finance';

联系合同范文客服:xxxxx#qq.com(#替换为@)