Beego框架学习笔记05--ORM删除数据

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一下,只用懂了前两种,希望早点能搞懂。

猜你喜欢

转载自blog.csdn.net/u013792921/article/details/84916308