Oracle 外键还是删除触发器?
各表:Oracle 外键还是删除触发器?,oracle,database-design,triggers,Oracle,Database Design,Triggers,各表: SIGN_OBJECT: ID VARCHAR2(32) PRIMARY KEY, DESCRIPTION VARCHAR2(100), X NUMBER(10,3), Y NUMBER(10,3), ... GEOMETRYID VARCHAR2(32) LAMPPOST_OBJECT: ID VARCHAR2(32) PRIMARY KEY, DESCRIPTION VARCHAR2(100), X NUMBER(10,3), Y NUMBER(10,3), ... GE
SIGN_OBJECT:
ID VARCHAR2(32) PRIMARY KEY,
DESCRIPTION VARCHAR2(100),
X NUMBER(10,3),
Y NUMBER(10,3),
...
GEOMETRYID VARCHAR2(32)
LAMPPOST_OBJECT:
ID VARCHAR2(32) PRIMARY KEY,
DESCRIPTION VARCHAR2(100),
X NUMBER(10,3),
Y NUMBER(10,3),
...
GEOMETRYID VARCHAR2(32)
OBJGEOMETRY:
GEOMETRYID VARCHAR2(32) PRIMARY KEY,
GEOMETRY MDSYS.SDO_GEOMETRY,
...
有许多X_对象表。不幸的是,模式设计者(以他们无限的智慧)没有看到各种对象类型之间的任何交叉。如果不做更多的工作,我无法更改这些表
对于每个对象表,都有一个触发器,用于在插入或更新之前创建相关的SDO_几何体值(GEOMETRYID是唯一的-它来自一个序列)。此时触发器调用一个包函数,该函数插入OBJGEOMETRY记录并返回geometryid
问题是,如果父记录被删除,我希望OBJGEOMETRY子记录也被删除
起初我认为这可以通过外键级联删除来实现,但当然FK需要父表中的主键——显然这不起作用
但是,我发现实际上FK需要父表中的唯一约束。我可以使X_OBJECT.GEOMETRYID唯一,但是我发现了问题,因为该GEOMETRYID尚未填充到父表中,但FK要求它存在。我无法在触发器内执行此操作(通过设置:NEW.GEOMETRYID),因此我必须先写入GEOMETRYID,然后提交吗?我不确定,而且这有很难闻的代码味道
那么我错了吗?对于删除触发器,这是一种更合适的情况吗?或者是我遗漏了什么
谢谢。如果在同一事务中同时插入OBJGEOMETRY和X_对象行,则可以将FK设置为“可延迟初始延迟”
在这种情况下,它将在
COMMIT
时间进行计算,而不是在运行INSERT
语句时进行计算。如果在同一事务中同时插入OBJGEOMETRY和X_对象行,则可以将FK设置为可延迟的初始延迟
在这种情况下,它将在
COMMIT
时间进行计算,而不是在运行INSERT
语句时进行计算。触发器应在INSERT或update之前触发,而不是在INSERT或update之后触发。然后可以使用包返回的值设置:NEW.GEOMETRYID
此外,外键指向错误的方向。应该是
ALTER TABLE x_OBJECT ADD外键(geometryid)引用objgeometry(geometryid)
因此,您需要一个删除触发器…触发器应该在插入或更新之前触发,而不是在插入或更新之后触发。然后可以使用包返回的值设置:NEW.GEOMETRYID 此外,外键指向错误的方向。应该是 ALTER TABLE x_OBJECT ADD外键(geometryid)引用objgeometry(geometryid)
因此,您需要删除触发器…外键需要引用表中的唯一约束。它们不需要主键约束,尽管这是最常见的唯一约束。外键需要引用表中的唯一约束。它们不需要主键约束,尽管这是最常见的唯一约束。它不是外键-它是删除触发器-正如你所说的是另一种方式。它不是外键-它是删除触发器-正如你所说的是另一种方式。