1.单表的删除
对于mysql数据库中的单表数据删除操作,直接借助于orm自带的Delete方法本身来完成就可以。只是要注意删除的时候记得指定一个筛选条件,这就好比sql语句当中的【delete from 表名 where xxx】当中的where条件一样。
o := orm.NewOrm()
var tempStuInfo models.StuInfo
tempStuInfo.Id = id_GetFromFont
_,err = o.Delete(&tempStuInfo)
2.级联关系表的删除
级联关系表有的时候也会被叫做一对多关系表,它指的是两个数据表之间的对应关系。例如表1和表2是级联关系表结构,那么一个表1中的数据可以同时对应多个表2中的数据,而一个表2中的数据却只能对应一个表1中的数据。
在图中表1中的StuInfo字段就级联了表2的信息数据。这个时候如果还是按照orm的Delete()指令去进行删除,那么orm仅仅能够将表1中的数据删除(也就是把某年某班...等的信息删除),但是和表1对应的表2数据(某年某班内对应的学生们)信息则不会消失。这种操作就会使得数据库中存在很多【拥有外键数据,但是外键却无法正确链接到另外数据表】的数据信息(毕竟班级都没了,学生还归属这个班级,这不乱了么?),因此针对级联关系表的删除操作,orm提供了一种名为级联删除的设置,当删除表1的时候会自动将表1级联的所有表中对应的数据一并删除。(就是删除班级的时候,把班级里面的学生信息也删除。)
级联删除:在设置外键的时候一并设置cascade,表示外键数据被删除时自己数据跟随被级联删除。
type Stu struct {
Id int `orm:"pk;auto"`
StuName string `orm:"size(100)"`
ClassroomBelong *Classroom `orm:"rel(fk);cascade"`
}
type Classroom struct {
Id int
ClassroomName string `orm:"size(100)"`
StuInfo []*Stu `orm:"reverse(many)"`
}
当然级联删除的语法存在很多种,在beego的orm中提供了下列四种对应的级联删除方式。
cascade | 级联删除(默认格式) |
set_null | 将外键数据设置为null |
set_default | 将外键数据设置为默认值 |
do_nothing | 什么都不做 |
其中第二种方式设置为null的时候需要注意orm数据表默认是非空的,因此如果需要设置为null则需要进行一下手动设置允许为null。
type Stu struct {
...
ClassroomBelong *Classroom `orm:"rel(fk);on_delete(set_null);null"`
}
3.表数据删除后的主键不重置问题
对于数据库中的主键(primary key)来说,即便表中的某一条数据删除也不会影响主键的固有自增顺序,因为主键的自增是不会受到外部信息变化的影响的。例如现在数据库中存在三名学生信息:
mysql> select * from article;
+----+---------+--------+--------------+
| id | stuname | stuage | classroom_id |
+----+---------+---------+-------------+
| 1 | stu1 | 18 | 1|
| 2 | stu2 | 16 | 1|
| 3 | stu3 | 15 | 2|
+----+---------+--------+--------------+
3 rows in set (0.07 sec)
mysql>
当执行删除操作将学生stu2信息删除,并再次向数据库中写入一名新学生stu4的信息。数据库中展示的效果却是下面的结果:
mysql> select * from article;
+----+---------+--------+--------------+
| id | stuname | stuage | classroom_id |
+----+---------+---------+-------------+
| 1 | stu1 | 18 | 1|
| 3 | stu3 | 15 | 2|
| 4 | stu4 | 40 | 1|
+----+---------+--------+--------------+
3 rows in set (0.06 sec)
mysql>
这中性质对于要根据主键去加载数据的页面来说简直就是灾难,例如留言板或者贴吧。针对这种问题需要进行主键重置操作,主要有三种解决办法:
暴力重置 | 清空原有的所有数据,强制让主键重新计数 | ~/$ truncate table 表名; |
友好重置 | 保存原有的数据,指定主键重新计数的位置 | ~/alter table 表名 AUTO_INCREMENT=自增开始数; |
完美重置 | 保存原有的数据,主键从初始数据开始重新计数 | 创建参照表,将原表数据拷贝到新表 |
ps:第三种没有特别弄明白..mark一下,只用懂了前两种,希望早点能搞懂。