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)


因此,您需要删除触发器…

外键需要引用表中的唯一约束。它们不需要主键约束,尽管这是最常见的唯一约束。外键需要引用表中的唯一约束。它们不需要主键约束,尽管这是最常见的唯一约束。它不是外键-它是删除触发器-正如你所说的是另一种方式。它不是外键-它是删除触发器-正如你所说的是另一种方式。