我的表是父子表,其中包含两列。第一列是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;
并将其置于检查约束内。
答案 0 :(得分:2)
您需要使用 外键约束和触发器的组合 来实现此约束
您可以在表格中使用可归零的外键。(parentID == null shows the root nodes)
对于select ID from table where ParentID = 0 (null)
约束{{1}}的部分,可以找到一些触发示例use a after insert or update DML trigger
答案 1 :(得分: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就不会被插入。
答案 2 :(得分:0)
您可以先修复数据模型。你的桌子有两种实体 - 父母和孩子。为您的父母创建一个单独的表,然后您可以使用普通的参考约束。