Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/09/2008, 12h40   #1
Invité de passage
 
Inscription : mars 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 6
Points : 1
Points : 1
Par défaut Index unique

J’ai un petit souci et j’espère que vous pourriez m’aider.
En fait j’ai un champ ‘numéro d’ordre’ ou je veux qu’il prend un numéro unique sauf pour Null et 0 ces deux la ne sont pas uniques et on peut les trouver plusieurs fois.
J’ai fait un index unique sur la table :
CREATE UNIQUE INDEX ix_table1 ON table1 (decode (numero_ordre, NULL, NULL,
0,0, champ2), numero_ordre);

Pour Null ca marche par contre pour 0 ca bloque :
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found
Merci de m’aider
mannou_k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 14h56   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Ton decode dit :
Si Null Then NULL et la valeur NULL n’est pas normalement indexé
Si 0 Then 0
Etc…

Donc si ils existent n valeurs 0 comment veux tu avoir un index unique ?

Question : C’est un index unique ou une contrainte d’unicité ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 14h59   #3
Invité de passage
 
Inscription : mars 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 6
Points : 1
Points : 1
J'ai fait un index unique
En fait je veux que tous les chiffres de 1 à 999 soient uniques par contre je peut avoir plusieurs 0 et plusieurs null.
mannou_k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 16h15   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Donc tu as besoin d’une contrainte. Est-ce que ta table contient déjà des données non uniques et que tu veux que les données à venir respectent cette règle ou est-ce que tu veux tout simplement ajouter une contrainte d’unicité un peu spéciale ?

PS Si tu fait quelque chose de type
Code :
1
2
 
CREATE UNIQUE INDEX ix_test_nr ON test_nr (decode(a,0,NULL,a))
ça va passer mais je ne pense pas que c'est une bonne solution.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 17h06   #5
Invité de passage
 
Inscription : mars 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 6
Points : 1
Points : 1
Et je fais comment si je change en contrainte unique pour qu'il puisse prendre plusieurs 0.

Sinon pour:
Code :
CREATE UNIQUE INDEX ix_test_nr ON test_nr (decode(a,0,NULL,a))
je l'ai déjà essayé mais même erreur.
mannou_k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 17h19   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par mannou_k Voir le message
Et je fais comment si je change en contrainte unique pour qu'il puisse prendre plusieurs 0.

Sinon pour:
Code :
CREATE UNIQUE INDEX ix_test_nr ON test_nr (decode(a,0,NULL,a))
je l'ai déjà essayé mais même erreur.
J'ai quelques doutes si tu me permets
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
Connected TO Oracle9i Enterprise Edition Release 9.2.0.5.0 
Connected AS mni
 
 
SQL> 
SQL> DROP TABLE test_nr
  2  /
 
TABLE dropped
 
SQL> CREATE TABLE test_nr (a number, b number)
  2  /
 
TABLE created
 
SQL> INSERT INTO test_nr VALUES(NULL, NULL)
  2  /
 
1 row inserted
 
SQL> INSERT INTO test_nr VALUES(NULL, NULL)
  2  /
 
1 row inserted
 
SQL> INSERT INTO test_nr VALUES(0,0)
  2  /
 
1 row inserted
 
SQL> INSERT INTO test_nr VALUES(0,0)
  2  /
 
1 row inserted
 
SQL> INSERT INTO test_nr SELECT level,level FROM dual connect BY level < 100
  2  /
 
99 rows inserted
 
SQL> commit
  2  /
 
Commit complete
 
SQL> SELECT a, count(*)
  2    FROM test_nr
  3   GROUP BY a
  4   HAVING count(*) > 1
  5  /
 
         A   COUNT(*)
---------- ----------
         0          2
                    2
 
SQL> CREATE UNIQUE INDEX ix_test_nr ON test_nr (decode(a,0,NULL,a))
  2  /
 
INDEX created
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 18h20   #7
Invité de passage
 
Inscription : mars 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 6
Points : 1
Points : 1
Je vais essayer .
Merci pour ton aide et bonne soirée
mannou_k est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h29.


 
 
 
 
Partenaires

Hébergement Web