mysql级联删除相关知识
-
聊聊数据库级联删除与伪删除的设计方案背景:这两天看了重温了下设计模式和数据结构,又补了下基础知识,然后就失眠了一整夜,不知为啥就想到级联及伪删数据这个问题。由于级联删除是几乎人人都会遇到的问题,但方案却有限却不美好,所以欢迎大伙集思文益,以下内容欢迎大伙一起讨论。级联删除的方式:方式1:数据库设定级联:常规MSSQL、MySql、Oracle都对设定了主外键关系的表提供级联删除。优点:数据准确、使用方便,数据库设计之初就设定好。缺点:1:增加对增删改时外键检测的额外开销。2:潜在危险系素大(如:删除部门或角色,发现一级联递归,整个系统的数据没了)。3:不方便触发其它事件。4:开发人员可能被屏蔽细节。总体描述:适合小系统、小局部、无缓存状态的情况使用。总体总结:很少使用。方式2:触发器处理。优点:DBA喜欢。缺点:程序员不喜欢,很容易蒙B。总体描述:适合系统负责人偏DBA爱好的场景,及业务无缓存场景。总体总结:内部业务系统使用多、外部系统使用少。方式3:业务代码控制优点:程序员喜欢,自由控制度大。缺点:程序员喜欢,自由控制度大(随着业务扩展,需
-
mysql支持跨表delete删除多表记录 前几天写了Mysql跨表更新的一篇总结,今天我们看下跨表删除。 在Mysql4.0之后,mysql开始支持跨表delete。 Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关系来删除某一个表中的记录。 假定我们有两张表:Product表和ProductPrice表。前者存在Product的基本信息,后者存在Product的价格。 第一种跨表删除的方式是不用join,在delete时指定用半角逗号分隔多个表来删除,如下sql语句: 复制代码 代码如下: DELETE p.*, pp.* FROM product p, productPrice pp WHERE p.productId = pp.productId AND p.created < '2004-01-01' 第二种跨表删除的方式是使用inner join在join中指定两表之间的关联关系,如下sql语句: 复制代码
-
在MySQL中删除表的操作教程丢弃现有MySQL的表是很容易的。但是需要非常小心,删除任何现有的一个表后将无法恢复,因为数据丢失。语法:下面是通用的SQL语法丢弃(删除)MySQL表:?1DROP TABLE table_name ;从命令提示符删除表:只需要在mysql>提示符下执行DROP TABLE SQL命令。例子:下面是一个例子,它删除表 tutorials_tbl:?1234567root@host# mysql -u root -pEnter password:*******mysql> use TUTORIALS;Database changedmysql> DROP TABLE tutorials_tblQuery OK, 0 rows affected (0.8 sec)mysql>使用PHP脚本删除MySQL表:要删除一个现有的表中的任何数据库中,将需要使用PHP函数mysql_query()。将通过它的第二个参数,正确的SQL命令删除表。例子:?1234567891011121314151
-
Linux——CentOS7之彻底删除mysql最近在倒哧mysql,然后结果是倒哧坏了。咋办?卸载吧~ 卸载过程很简单,只需要以下几条命令 yum remove mysql mysql-server mysql-libs mysql-server; 当然是删不干净的 然后我们需要查找跟mysql有关的文件全删了 find / -name mysql 然后用yum remove命令删除查到的相关程序 rpm -qa|grep mysql 过程如下 [root@VM_183_120_centos log]# yum remove mysql mysql-server mysql-libs mysql-server; Loaded plugins: fastestmirror, langpacks Resolving Depende
mysql级联删除相关课程
-
MySQL提升课程 全面讲解MySQL架构设计 如何获得MySQL最优性能?如何建立MySQL高可用集群?如何搭建稳定高效的MySQL环境?国内顶级电商公司数据库专家带你成为一名优秀的DBA。
讲师:sqlercn 中级 4050人正在学习
mysql级联删除相关教程
- 3. 级联删除 前面讲解双向一对多的时候,也提到了级联删除。最大的印象就是,如果双方都打开了级联删除,删除时就如同推倒了多米诺骨牌的第一张牌,整个数据链都会删除。多对多关联比一对多关联多了一张中间表,在进行级联删除的时候,到底会发生什么事情?在此也有必要拿出来说一说。为了不让事情的发展如山崩一样不可控制,先打开学生类的级联操作功能:private Set<Course> courses=new HashSet<Course>(); @ManyToMany(targetEntity = Course.class,cascade=CascadeType.ALL) @JoinTable(name = "score", joinColumns = @JoinColumn(name = "stuId", referencedColumnName = "stuId"), inverseJoinColumns = @JoinColumn(name = "courseId", referencedColumnName = "courseId")) public Set<Course> getCourses() { return courses; }这里使用 CascadeType.ALL。来一段测试实例,删除刚才添加的 HibernateTemplate 同学。他会说我好悲惨,才进来没有多久。HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>(); hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { // 查询学生 Student student =(Student)session.get(Student.class, new Integer(23)); session.delete(student); return null; } });无惊无喜,一切按照预先的设想进行。删除学生时,中间表中与此学生有关联的信息,也就是说此学生选修的课程信息也自动被删除了。但是,会有一个想法,如果删除课程,则中间表中记录的与此课程有关的信息是否会自动删除呢?OK!开始行动之前,可别忘记在课程类中打开级联操作选项:嘿嘿!现在两边的级联操作功能都已经打开。private Set<Student> students=new HashSet<Student>(); @ManyToMany(targetEntity = Student.class, mappedBy = "courses",cascade=CascadeType.ALL) public Set<Student> getStudents() { return students; }打开后,执行删除 C 课程的实例,谁让 C 不好学了。HibernateTemplate<Course> hibernateTemplate = new HibernateTemplate<Course>(); hibernateTemplate.template(new Notify<Course>() { @Override public Course action(Session session) { // 查询学生 Course course =(Course)session.get(Course.class, new Integer(2)); session.delete(course); return null; } });这只是一个很简单的代码,但是却发生如雪崩一样的事件。到底发生了什么事情?大家进入 MySql 看看就知道了。3张表中空空如也,所有数据都没有了。就如同前面讲解一对多的级联删除一样。同样适用于多对多关联映射之中。因两边都已经打开了级联,删除操作如同无法控制的坏情绪,删除课程时,以中间表为连接,反复来往于三张表,把相关信息全部删除。所以,使用级联时一定要小心,否则,小心脏真的有点受不了。
- 2.5 级联操作 Hibernate 提供的级联操作带来了很多方便。但是,特别是在双向关联映射的情况下,不要把两边的级联操作全部打开,否则会把不该删除的数据删除掉。测试数据被级联删除倒无所谓,真实数据被删除了,可能就欲哭无门。
- 4. 一对多关联映射中的级联操作 什么是级联操作?关系型数据库中由主外键维系的两张表,具有主从关系。如学生表和班级表,班级班是主表,学生表是从表。类似于删除某一个班级的信息,则需要先删除所在班的学生信息,再删除班级信息,这个操作就是级联操作。所谓级联操作,指操作一张表时,是否会牵连到与之有关联的其它表。现在,咱们是使用 Hibernate 进行数据操作,不可能还要劳驾自己亲力亲为吧。只需要做些简单配置,就可以让 Hibernate 自动做级联操作。进入班级类,修改代码如下:@OneToMany(targetEntity=Student.class,mappedBy="classRoom",cascade=CascadeType.REMOVE) public Set<Student> getStudents() { return students; }很简单,只需要使用 @OneToMany 的 cascade 属性,就能让 Hibernate 明白如何做级联操作。默认情况下,没有级联效应。cascade 是一个枚举类型:public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH}ALL: 级联所有操作;PERSIST: 级联新增;MERGE: 级联更新或者新增;REMOVE: 级联删除;REFRESH: 级联刷新;DETACH: 级联分离。测试删除班级实例:HibernateTemplate<ClassRoom> hibernateTemplate = new HibernateTemplate<ClassRoom>(); hibernateTemplate.template(new Notify<ClassRoom>() { @Override public ClassRoom action(Session session) { ClassRoom classRoom=(ClassRoom)session.get(ClassRoom.class, new Integer(1)); session.delete(classRoom); return null; } });如果不添加 cascade 相关说明,因为有学生引用班级信息,班级信息是不能被删除的。添加后再测试,查看表中内容:班级以及班级所在学生信息全部删除!删除班级时能级联删除学生,反过来,删除学生能删除班级吗?想法很好,实践是检验真理的唯一手段,学生类中修改成如下代码:@ManyToOne(targetEntity=ClassRoom.class,cascade=CascadeType.REMOVE) @JoinColumn(name="classRoomId") public ClassRoom getClassRoom() { return classRoom; }测试实例:HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>(); hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { Student stu=(Student)session.get(Student.class, new Integer(2)); session.delete(stu); return stu; } });结果很残酷!学生被删除了,班级也被删除了!级联级联,只要设置了级联,不管删除学生还是班级,只要在对应表中有引用关系的数据就会被删除。现在,学生类、班级类中的级联删除都打开了。如果对下面情形的数据(编号 1、2 的学生的班级编号都为 1)进行删除操作,则会发生什么事情?数据库中的数据如下:测试删除编号为 1 的学生:HibernateTemplate<Student> hibernateTemplate = new HibernateTemplate<Student>(); hibernateTemplate.template(new Notify<Student>() { @Override public Student action(Session session) { Student stu=(Student)session.get(Student.class, new Integer(1)); session.delete(stu); return stu; } });进入 MySql,查看一下:天呀!这是级联还是株连呀,太让人后怕,数据都没有了。删除学生时,会级联删除和学生有关的班级,班级删除时,又会查看学生表中是否还存在与班级有关联的学生,有,则一刀下去,连根拔起。Hibernate 有点刹不住车,产生了级联连锁反应。针对上面的测试,如果班级表的级联关闭,执行测试代码,请问结果又会怎样?本节课程,讲解了级联删除,级联添加的内容留到下节课继续展开。
- 4. 删除联系人 本小节实现删除联系人的功能,如下所示:elif choice == '4': name = input('name: ') for person in persons: if person['name'] == name: persons.remove(person) break在第 1 行,如果 choice == ‘4’,则执行删除联系人的功能在第 2 行,获取用户输入的 name在第 3 行,遍历列表 persons,循环变量 person 是一个字典在第 4 行,如果用户输入的 name 和循环访问 person 的 name 相同,则表示找到指定的 person在第 5 行,使用方法 persons.remove(person), 从 persons 中删除元素 person在第 6 行,退出 for 循环
- 6. 删除联系人 本小节实现删除联系人的功能,如下所示: def delete_person(self): name = input('name: ') for person in self.persons: if person['name'] == name: self.persons.remove(person) break 在第 1 行,定义函数 delete_person,实现删除联系人的功能在第 2 行,获取用户输入的 name在第 3 行,遍历列表 self.persons,循环变量 self.persons 是一个字典在第 4 行,如果用户输入的 name 和循环访问 person 的 name 相同,则表示找到指定的 person在第 5 行,使用方法 self.persons.remove(person),从 self.persons 中删除元素 person在第 6 行,退出 for 循环
- 6. 删除联系人 本小节实现删除联系人的功能,如下所示:def delete_person(): name = input('name: ') for person in persons: if person['name'] == name: persons.remove(person) break在第 1 行,定义函数 delete_person,实现删除联系人的功能在第 2 行,获取用户输入的 name在第 3 行,遍历列表 persons,循环变量 person 是一个字典在第 4 行,如果用户输入的 name 和循环访问 person 的 name 相同,则表示找到指定的 person在第 5 行,使用方法 persons.remove(person), 从 persons 中删除元素 person在第 6 行,退出 for 循环
mysql级联删除相关搜索
-
mac osx
machine_start
macox
magellan
malloc
manifest
manifest文件
map
map 遍历
mapreduce编程
maps google com
margin
margin bottom
margin left
margin right
margin top
marginbottom
marginheight
marginleft
margintop