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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值