1. 程式人生 > >Beego框架學習筆記05--ORM刪除資料

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一下,只用懂了前兩種,希望早點能搞懂。