常用构建基块 > 数据库连接构建基块 > 数据库活动 > 使用外键设置删除行为
使用外键设置删除行为
当删除外键关系中任意一方的实体时,必须指定该关系中另一方实体所发生的情况。这样可确保参考的完整性得以保持,同时遵循基于业务逻辑所做出的任何决策。
删除行为在数据形状的数据库信息中指定,且位于指定了外键的数组中。删除行为 (如果存在) 将针对每个单独的外键指定。有关详细信息,请参阅添加或移除外键
在以下说明中,A 是具有外键的实体,B 是具有外键所参考字段的实体。
onDelete - 确定删除 B 时 A 所发生的情况。
CASCADE - 在删除 B 的同时也会删除 A。这一行为被称作级联删除。
SET_NULL - 删除 B 时,将 A 的外键字段值设置为 null。
如果未指定 onDelete,则在删除 B 时,A 将保持不变。
deleteReference - 确定删除 A 时 B 所发生的情况。
如果设置成 true,则在删除 A 的同时也会删除 B。
如果设置成 false 或未予指定,则在删除 A 时,B 将保持不变。
例如,重复的日历天 (PTC.Shift.CalendarDayRepeating) 是日历与排班之间的关系。使用外键字段对重复的日历天进行了此定义,其中的外键字段引用了日历的 UID (CalendarUID) 和排班的 UID (ShiftScheduleUID)。以下代码来自为 PTC.ShiftImpl.Manager 事物的 GetDBInfo 服务的重复日历天数据形状 (PTC.Shift.CalendarDayRepeating) 指定的数据库信息。
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,因此在删除其中一个所引用工作定义的同时,也会删除工作定义链接。这样可确保参考的完整性;工作定义链接存在的前提是该关系的每一方均具有工作定义。
由于 ChildUID 字段上外键的 deleteReference 被设置为 true,因此在删除工作定义链接时,也会删除 ChildUID 字段所引用的工作定义。此行为由以下业务决策确定:如果父项和子项工作定义间的链接被删除,则必须同时删除子项工作定义。
* 
与数据库同步前,无需指定删除行为即可将新的数据形状或外键添加至数据库架构。最佳做法是应在删除外键关系任意一方的任何数据形状实例前指定删除行为。
数据库管理事物形态 (PTC.DBConnection.DBManagementThingShape) 中提供了用于执行删除行为同时符合每个外键的 onDeletedeleteReference 设置的服务。这些服务包括 BatchCascadeDeleteCascadeDeleteCollectActionForCascadeDelete。所有管理器均扩展自此事物形态,因此它们继承了上述服务。有关详细信息,请参阅数据库管理事物形态服务
针对各个数据模型对象的标准删除操作,例如 DeleteShiftDeleteJobOrder,仅删除指定的实体。如果仅删除指定实体违背了参考完整性,则服务将失败。在这种情况下,请使用级联删除服务。这里有一个例外,就是用来调用 CascadeDeleteModel 服务的 PTC.MfgModelImpl.Manager 事物的 DeleteSite 服务。
这对您有帮助吗?