3

我的表是父子表,其中包含两列。第一列ID是自动编号。另一列是ParentID具有特殊条件的列。如果该行是父行,ParentID = 0否则它应该与 ParentID 行相关。例如:

**ID** | **ParentID**
---------------------
1        0
2        0
3        2
4        [it can be 0 or 1 or 2 NOT 3]

ParentID 取决于 ID 列,如果 ID 包括 ParentID = 0,则 ParentID 可以是该 ID。

问题是我可以做这样的事情吗?

constraint ParentID_ck ckeck(ParentID in(0, select ID from table where ParentID = 0;))

或者我应该使用其他解决方案,例如 PL/SQL:

DECLARE
--Somthing..
BEGIN
--Somthing..
END;

并将其放在检查约束内。

4

3 回答 3

2

您需要结合外键约束和触发器
来实现此约束 您可以使用从表到自身的可空外键。(parentID == null shows the root nodes).
对于约束的一部分,select ID from table where ParentID = 0 (null)您可以使用插入后或更新 DML 触发器,可以在此处找到一些触发器示例

于 2013-05-27T05:38:08.940 回答
0

您可以执行以下操作:

insert into TABLE_NAME(PARENT_ID,ID)
(select <THE_PARENT_ID>, <ID> from DUAL where 
  exists (select 1 from TABLE_NAME where PARENT_ID = <THE_PARENT_ID>))

这样就不会插入那些实际上不在 TABLE_NAME 中的 PARENT_ID。

于 2013-05-27T05:15:41.530 回答
0

您可以通过先修复数据模型来做到这一点。您的表有两种实体 - 父母和孩子。为您的父母创建一个单独的表,然后您可以使用普通的引用约束。

于 2013-05-27T05:49:10.767 回答