2017-03-08 1 views
0

Je dois ajouter une contrainte à une table Oracle. Une colonne numérique doit être zéro ou unique (et> 0). J'ai essayé d'insérer des requêtes à l'intérieur de la définition ou des fonctions de la contrainte, mais elles ne sont pas autorisées. Une idée? Salutations, Marcelo.Colonne de contrainte de vérification Oracle soit zéro soit unique

+0

pouvez-vous nous montrer la contrainte de vérification comment c'est? et aussi nous montrer l'insert? et DDL de la table serait un plus – Moudiz

+0

Pourquoi zéro? Quelle est la règle métier que cette contrainte tente de faire appliquer? – APC

+0

On dirait un doublon. http://stackoverflow.com/questions/42671008/how-do-i-add-a-not-null-column-and-a-check-constraint-in-one-line-in-oracle-11g il vous semble guyz travailler ensemble – XING

Répondre

1

Si je comprends bien votre besoin, vous pouvez utiliser un index basé sur la fonction pour vérifier l'unicité uniquement sur les valeurs positives.

Par exemple:

SQL> create table checkUniqueTab(n number); 

Table created. 

SQL> create unique index i1 on checkUniqueTab(case when n > 0 then n end); 

Index created. 

Insertion des valeurs différentes travaillent:

SQL> insert into checkUniqueTab values (1); 

1 row created. 

SQL> insert into checkUniqueTab values (2); 

1 row created. 

Ici j'essaie d'insérer une valeur positive en double:

SQL> insert into checkUniqueTab values (1); 
insert into checkUniqueTab values (1) 
* 
ERROR at line 1: 
ORA-00001: unique constraint (ALEK.I1) violated 

Je peux insérer plusieurs lignes avec 0 valeur:

SQL> insert into checkUniqueTab values (0); 

1 row created. 

SQL> insert into checkUniqueTab values (0); 

1 row created. 

Le résultat:

SQL> select * from checkUniqueTab; 

     N 
---------- 
     1 
     2 
     0 
     0 

Cela suppose que vous avez déjà une contrainte sur votre table pour éviter d'insérer des valeurs négatives.

+0

Cette solution est très soignée mais elle permet également de dupliquer des valeurs négatives. Donc je pense que nous avons encore besoin d'une contrainte de vérification pour appliquer '(n> = 0)'. – APC

+0

C'est ce que je voulais !!! Je vous remercie! –

+0

@APC: Vous avez raison; Je supposais qu'une telle contrainte existe déjà sur la table, mais il vaut mieux clarifier. Aller à modifier – Aleksej