建構區塊 > 通用建構區塊 > 資料庫連線建構區塊 > 資料庫活動 > 使用外部索引鍵設定刪除行為
使用外部索引鍵設定刪除行為
當刪除外部索引鍵關係任一側的實體時,必須指定關係另一側的實體將發生什麼情況。如此可確保維持參考性完整,並遵循任何依據商業邏輯的決定。
刪除行為在資料形式的資料庫資訊中指定,其位於用來指定外部索引鍵的相同陣列中。會針對每個個別外部索引鍵指定刪除行為 (如果有)。若需進一步資訊,可參閱 新增或移除外部索引鍵
在下列說明中,A 是具有外部索引鍵的實體,B 是具有外部索引鍵所參考之欄位的實體。
onDelete - 可決定若將 B 刪除,A 會發生的情況。
CASCADE - 若刪除 B,也會刪除 A。這稱為串聯刪除。
SET_NULL - 若刪除 B,A 的外部索引鍵欄位值會設定為空值。
若未指定 onDelete,則當刪除 B 時,A 不會發生任何情況。
deleteReference - 可決定若將 A 刪除,B 會發生的情況。
若設定為 true,當刪除 A 時,也會刪除 B。
若設定為 false 或未指定,則當刪除 A 時,B 不會發生任何情況。
例如,重複曆日 (PTC.Shift.CalendarDayRepeating) 是行事曆與班次時間表之間的關係。這是在重複曆日上以參考行事曆的 UID (CalendarUID) 及班次時間表 (ShiftScheduleUID) 的外部索引鍵欄位所定義。下列程式碼來自為重複曆日資料形式 (PTC.Shift.CalendarDayRepeating) 指定的資料庫資訊,該資料形式位於 PTC.ShiftImpl.Manager 物件的 GetDBInfo 服務中。
foreignKeys: [{
name: "calendarUid",
referenceDataShapeName: "PTC.Shift.Calendar",
referenceFieldName: "uid",
onDelete: "CASCADE"
}, {
name: "shiftScheduleUid",
referenceDataShapeName: "PTC.Shift.ShiftSchedule",
referenceFieldName: "uid",
deleteReference: true
}, {
name: "siteUid",
referenceDataShapeName: "PTC.MfgModel.Site",
referenceFieldName: "uid"
}]
由於 onDelete 針對兩個外部索引鍵都設定為 CASCADE,因此如果刪除其中一個參考的工作定義,則也會刪除工作定義連結。這可確保參考完整性;如果關係的每一側都不存在工作定義,則工作定義連結也無法存在。
由於 deleteReference 會針對 ChildUID 欄位中的外部索引鍵設定為 true,因此如果刪除工作定義連結,也會刪除由 ChildUID 欄位參考的工作定義。此行為由企業決策所決定,指定在刪除父與子工作定義之間的連結時,也必須刪除子工作定義。
* 
與資料庫同步處理之前,不需要指定刪除行為,即可將新資料形式或外部索引鍵新增至資料庫結構描述。最佳作法是,應在刪除外部索引鍵關係任一側之資料形式的任何實例之前指定刪除行為。
用來執行刪除,同時符合每個外部索引鍵 onDeletedeleteReference 設定的服務可在資料庫管理物形式中找到 (PTC.DBConnection.DBManagementThingShape)。這些服務有 BatchCascadeDeleteCascadeDeleteCollectActionForCascadeDelete。所有管理員都會從此物形式延伸,因此它們會繼承這些服務。如需詳細資訊,請參閱資料庫管理物形式服務
個別資料模型物件的標準刪除動作 (例如 DeleteShiftDeleteJobOrder) 只會刪除指定實體。如果僅刪除該實體違反參考完整性,則服務失敗。在上述情況下,請使用串聯刪除服務。這有一個例外,就是呼叫 CascadeDeleteModel 服務的 PTC.MfgModelImpl.Manager 物件中的 DeleteSite 服務。
這是否有幫助?