ven. 09 août 2019, 20h42
Francis Faure
France
atoutfox.public.association
Re: indexation UNIQUE
Bonsoir Guy,
- Si tu veux qu'une colonne contienne que des des valeurs "uniques" :
définir l'index comme "Candidat" au lieu de "Régulier"
- Si tu veux qu'une colonne puisse contenir des valeurs dupliquées mais un index "UNIQUE" (clause de l'époque),
alors tu peux mettre la clause "unique" dans un autre index...
- Personnellement je n'utilise PAS la clause "unique" en ayant eu trop de problème provenant des enregistrements supprimés qui du coup rend l'index "UNIQUE" incomplet... !
Je viens de faire un petit PRG de test pour toi :
create table "c:\temp\ajeter" free ("ID" integer autoinc, "COLONNE1" char(10), "COLONNE2" char(10))
index on COLONNE1 tag "iColonne1"
index on COLONNE1 tag "uColonne1" unique
local liI as integer
for liI = 1 to 10
if mod(m.liI, 2) == 0
insert into "ajeter" ("COLONNE1", "COLONNE2") values ("Papa", "Maman")
else
insert into "ajeter" ("COLONNE1", "COLONNE2") values ("Maman", "Papa")
endif
NEXT
SET ORDER TO "iColonne1"
GO top
BROWSE LAST TITLE "sur index iColonne1"
SET ORDER TO "uColonne1"
GO top
BROWSE LAST TITLE "sur index uColonne1"
* Vérification de l'ancienne clause "unique" dans l'onglet "Index" : ok
MODIFY STRUCTURE
Donc j'obtiens un CDX contenant 2 index sur même champ dont l'un avec la clause "Unique" ...
Mais attention :
par exemple après la boucle de remplissage si tu supprime le premier enregistrement.... ,
en ajoutant :
DELETE FROM "ajeter" WHERE ID=1
Alors cela ne fonctionne plus... correctement pour l'index "UNIQUE"
Certains diront que : "c'est normal" car il faut créer l'index comme ceci :
index on COLONNE1 tag "uColonne1" FOR !DELETED() unique
au lieu de
index on COLONNE1 tag "uColonne1" unique
oui.... et bien faire le test... et le résultat sera le même....
Cela donnerait le test final suivant qui révèle bien le problème :
create table "c:\temp\ajeter" free ("ID" integer autoinc, "COLONNE1" char(10), "COLONNE2" char(10))
index on COLONNE1 tag "iColonne1"
index on COLONNE1 tag "uColonne1" for !deleted()unique
local liI as integer
for liI = 1 to 10
if mod(m.liI, 2) == 0
insert into "ajeter" ("COLONNE1", "COLONNE2") values ("Papa", "Maman")
else
insert into "ajeter" ("COLONNE1", "COLONNE2") values ("Maman", "Papa")
endif
next
delete from "ajeter" where id=1
set order to "iColonne1"
go top
browse last title "sur index iColonne1"
* Dysfonctionnement ici : il manque un enregistrement...
set order to "uColonne1"
go top
browse last title "sur index uColonne1"
* Vérification de l'ancienne clause "unique" dans l'onglet "Index" : ok
modify structure
Maintenant si c'est sur un table qui n'a pas de suppression possible (Facture par exemple) ou un fichier temporaire : alors ça peut être "utilisable"...
Mais, personnellement, je n'utilise historiquement jamais la clause "UNIQUE"
Cordialement
Francis
Le ven. 09 août 2019, 18h54 BONEMME a écrit :
> Bonjour à tous
>
> Est-il possible via le project manager et une table libre 5 champs
> ayant deux index(cdx)sur: champ1 et champ2
> et d'y ajouter 2 index supplémentaires sur les mêmes champs mais
> UNIQUE.
> ou dois je passer par une indexation IDX manuelle?
>
> Alternative
> passer par des tables temporaires
> SET UNIQUE ON
> (copy champ1 to temp1, idem pour champ2 TO temp2 )
> use temp1
>
> Merci de confirmer
>
> Guy Bonemme
>
Journal
GLS pense que ce message est la bonne réponse ou qu'il est utile
Permalink : http://www.atoutfox.org/nntp.asp?ID=0000019436