自定义信息内容和访问 > 数据库活动 > 设置外键的删除行为
设置外键的删除行为
当删除外键关系中任意一方的实体时,必须指定该关系中另一方实体所发生的情况。这样可确保参考的完整性得以保持,同时遵循基于业务逻辑所做出的任何决策。
删除行为于数据形状的数据库信息中指定,且位于指定 外键的同一数组中。删除行为 (如果存在) 将针对每个单独的外键指定。在以下说明中,A 是具有外键的实体,B 是具有外键所参考字段的实体。
onDelete - 确定删除 B 时 A 所发生的情况。
CASCADE - 在删除 B 的同时也会删除 A。这一行为被称作级联删除。
SET_NULL - 删除 B 时,将 A 的外键字段值设置为空。
如果未指定 onDelete,则在删除 B 时,A 将保持不变。
deleteReference - 确定删除 A 时 B 所发生的情况。
如果设置成 true,则在删除 A 的同时也会删除 B。
如果设置成 false 或未予指定,则在删除 A 时,B 将保持不变。
例如, 工作定义链接为父项工作定义与子项工作定义之间的关系。这一定义的依据为工作定义链接的外键字段引用了两个工作定义的 UID (ParentUIDChildUID)。以下代码源自为 PTC.SCA.SCO.DefaultProductionOrderManager 上的 GetWorkDefinitionDBInfo 服务内的工作定义链接数据形状 (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,因此在删除其中一个所引用工作定义的同时,也会删除工作定义链接。这样可确保参考的完整性;工作定义链接存在的前提是该关系的每一方均具有工作定义。
由于 ChildUID 字段上外键的 deleteReference 被设置为 true,因此在删除工作定义链接时,也会删除 ChildUID 字段所引用的工作定义。此行为由以下业务决策确定:如果父项和子项工作定义间的链接被删除,则必须同时删除子项工作定义。
* 
与数据库同步前,无需指定删除行为即可将新的数据形状或外键添加至数据库架构。最佳做法是:应在删除外键关系任意一方的任何数据形状实例前指定删除行为。
数据库管理事物形态 (PTC.SCA.SCO.DBManagementThingShape) 中提供了用于执行删除,同时遵守每个外键的 onDeletedeleteReference 设置的服务。这些服务包括 BatchCascadeDeleteCascadeDeleteCollectActionForCascadeDelete。所有管理器均派生自此事物形态,因此它们继承了上述服务。有关详细信息,请参阅 数据库管理事物形态服务
Operator Advisor 数据模型 ( 工作定义相关文档工作定义插图) 也引用 ThingWorx 文件信息库中存储的文件。作业单管理器事物模板 (PTC.SCA.SCO.JobOrderManagerThingTemplate) 的 BatchCascadeDelete 服务已改写,使得当引用这些文件的实体被删除时,所引用的文件也从文件信息库中删除。
针对各个数据模型对象的标准删除操作,例如 DeleteShiftDeleteJobOrder,仅删除指定的实体。如果仅删除指定实体违背了参考完整性,则服务将失败。在这种情况下,请使用级联删除服务。