关联表记录的删除操作
更新时间:2023-10-26 03:47:01 阅读量: 综合文库 文档下载
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';
正在阅读:
关联表记录的删除操作10-26
怎么给word文档加密?04-24
依法使用武器警械专项训练基本知识题库01-21
关于我的心愿作文优秀作文600字作文5篇04-04
合同法案例带分析(按章节附带的经典案例)01-10
【西北工业大学】声学原理与技术作业集05-09
组织行为学考试重点(陈春花)09-21
租赁权物权效力的善意取得04-08
道路及排水工程安全施工方案04-29
道德学习与脑培养.doc06-08
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 关联
- 删除
- 操作
- 记录
- 第十届小机灵杯 五年级(初赛)
- 工程力学模拟试题
- 银行IT蓝图先进个人材料
- 5s中文电路原理详解,绝好的 - 图文
- 基于matlab的异步电机变频调速系统的设计
- 策划部新学期工作规划和招新计划(精)
- 应用统计学习题
- 现代社会调查方法
- 核磁共振光谱练习题
- 中山医实习出科考内科04.3.24
- 2017 - 2018学年度开学典礼策划方案
- 特长生管理制度
- 管理毕业论文 中小企业吸引人才策略研究
- 六年级环境教育
- 铁道通信信号作业及参考答案
- 《仁义礼智,我固有之》导学案
- 计算机网络技术习题(参考答案)
- 当前城市管理中遇到的抗法及其解决对策(毕业论文)
- 三相异步电动机检查试验方法
- 作业3 传统文化与学科整合应用成果(教学设计方案)(2)(1) - 图文