自訂資訊內容與存取 > 資料庫活動 > 使用外部索引鍵設定刪除行為
使用外部索引鍵設定刪除行為
當刪除外部索引鍵關係任一側的實體時,必須指定關係另一側的實體將發生什麼情況。如此可確保維持參考性完整,並遵循任何依據商業邏輯的決定。
刪除行為在資料形式的資料庫資訊中指定,其位於指定 外部索引鍵的相同陣列中。會針對每個個別外部索引鍵指定刪除行為 (如果有)。在下列說明中,A 是具有外部索引鍵的實體,B 是具有外部索引鍵所參考之欄位的實體。
onDelete - 可決定若將 B 刪除,A 會發生的情況。
CASCADE - 若刪除 B,也會刪除 A。這稱為串聯刪除。
SET_NULL - 若刪除 B,A 的外部索引鍵欄位值會設定為空值。
若未指定 onDelete,則當刪除 B 時,A 不會發生任何情況。
deleteReference - 可決定若將 A 刪除,B 會發生的情況。
若設定為 true,當刪除 A 時,也會刪除 B。
若設定為 false 或未指定,則當刪除 A 時,B 不會發生任何情況。
例如, 工作定義連結是父工作定義與子工作定義之間的關係。這會在外部索引鍵欄位參考兩個工作定義 (ParentUIDChildUID) 之 UID 的工作定義連結上定義。下列程式碼來自在 GetWorkDefinitionDBInfo 服務的 PTC.SCA.SCO.DefaultProductionOrderManager 中,針對工作定義連結資料形式 (PTC.SCA.SCO.WorkDefinitionLink) 指定的資料庫資訊。
"foreignKeys": [{
"name": "ChildUID",
"referenceDataShapeName": "PTC.SCA.SCO.WorkDefinition",
"referenceFieldName": "UID",
"onDelete": "CASCADE",
"deleteReference": true
}, {
"name": "ParentUID",
"referenceDataShapeName": "PTC.SCA.SCO.WorkDefinition",
"referenceFieldName": "UID",
"onDelete": "CASCADE"
}]
由於 onDelete 針對兩個外部索引鍵都設定為 CASCADE,因此如果刪除其中一個參考的工作定義,則也會刪除工作定義連結。這可確保參考完整性;如果關係的每一側都不存在工作定義,則工作定義連結也無法存在。
由於 deleteReference 會針對 ChildUID 欄位中的外部索引鍵設定為 true,因此如果刪除工作定義連結,也會刪除由 ChildUID 欄位參考的工作定義。此行為由企業決策所決定,指定在刪除父與子工作定義之間的連結時,也必須刪除子工作定義。
* 
與資料庫同步處理之前,不需要指定刪除行為,即可將新資料形式或外部索引鍵新增至資料庫結構描述。最佳作法是,應在刪除外部索引鍵關係任一側之資料形式的任何實例之前指定刪除行為。
用來執行刪除,同時符合每個外部索引鍵 onDeletedeleteReference 設定的服務可在資料庫管理物形式中找到 (PTC.SCA.SCO.DBManagementThingShape)。這些服務有 BatchCascadeDeleteCascadeDeleteCollectActionForCascadeDelete。所有管理員都會從此物形式延伸,因此它們會繼承這些服務。如需詳細資訊,請參閱 資料庫管理物形式服務
Operator Advisor 資料模型中的某些實體 ( 工作定義相關文件工作定義說明) 也會參考儲存在 ThingWorx 檔案存放庫中的檔案。工作訂單管理員物範本 (PTC.SCA.SCO.JobOrderManagerThingTemplate) 上的 BatchCascadeDelete 服務已被取代,因此,在參考這些檔案的實體被刪除後,這些參考檔案也會從檔案存放庫中刪除。
個別資料模型物件的標準刪除動作 (例如 DeleteShiftDeleteJobOrder) 只會刪除指定實體。如果僅刪除該實體違反參考完整性,則服務失敗。在上述情況下,請使用串聯刪除服務。