Sql 我可以使用带有check约束的select语句吗

Sql 我可以使用带有check约束的select语句吗,sql,oracle,plsql,constraints,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,它是自动编号。另一列是具有特殊条件的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;

并将其置于检查约束内。

您可以执行以下操作:

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

这样就不会插入那些实际上不在表\u名称中的父\u ID

您需要结合外键约束和触发器来实现此约束 您可以将表中可为null的外键用于表本身。parentID==null显示根节点。
对于约束的select ID from table(其中ParentID=0 null)部分,可以找到一些触发器示例

您可以通过首先修复数据模型来完成此操作。您的表有两种实体-父实体和子实体。为您的父母创建一个单独的表,然后您可以使用普通的引用约束。

我需要限制用户使用该约束。用户无法插入任何与该条件相反的行。是否有其他解决方案将其限制在一个表中?是的,他不情愿地说,您可以序列化每个insert/update/delete并使用触发器进行检查,但当存在一个更简单、性能更好的解决方案时,为什么不使用它呢?任务是这样的。谢谢