我可以使用带有检查约束的select语句

时间:2013-05-27 04:03:02

标签: sql oracle plsql constraints

我的表是父子表,其中包含两列。第一列是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;

并将其置于检查约束内。

3 个答案:

答案 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)

您可以先修复数据模型。你的桌子有两种实体 - 父母和孩子。为您的父母创建一个单独的表,然后您可以使用普通的参考约束。