2013-05-27 3 views
3

Ma table est une table parent-enfant où elle comprend deux colonnes. La première colonne est ID qui est le numéro automatique. L'autre colonne est ParentID qui a les conditions spéciales. Si la ligne est parent la ParentID = 0 sinon elle devrait être liée à une ligne ParentID. Par exemple:Puis-je utiliser l'instruction select avec la contrainte de vérification?

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

Le ParentID dépend de la colonne ID, si l'ID comprend ParentID = 0 alors le ParentID peut être qu'une pièce d'identité.

La question est est ce que je peux faire quelque chose comme ça ??

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

Ou devrais-je utiliser d'autres solutions telles que PL/SQL:

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

et le mettre à l'intérieur de la contrainte de vérification.

Répondre

0

Vous pouvez faire quelque chose comme:

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

Alors que ces PARENT_ID pour qui sont en fait pas dans le TABLE_NAME ne seraient pas insérés.

+0

Je dois limiter l'utilisateur à cette contrainte. Où l'utilisateur ne peut pas insérer une ligne opposée à cette condition. – 7alhashmi

2

Vous devez mettre en œuvre cette contrainte avec combinaison de contrainte de clé étrangère et un déclencheur
Vous pouvez utiliser une clé étrangère nul en mesure de la table elle-même. (parentID == null shows the root nodes).
Pour la partie de select ID from table where ParentID = 0 (null) de la contrainte que vous peut use a after insert or update DML trigger, quelques exemples de déclenchement se trouve here

0

Vous pouvez le faire en fixant votre modèle de données en premier. Votre table a deux types d'entités - les parents et les enfants. Créez une table distincte pour vos parents, vous pouvez alors utiliser des contraintes référentielles ordinaires.

+0

Existe-t-il une autre solution pour le limiter à l'intérieur d'une table? – 7alhashmi

+0

Oui (il a dit, à contrecœur), vous * pourriez * sérialiser chaque insertion/mise à jour/supprimer et vérifier avec des déclencheurs, mais quand une solution plus simple et plus performante existe, pourquoi ne pas l'utiliser? –

+0

La tâche est comme ceci. Merci – 7alhashmi

Questions connexes