ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Forum AtoutFox : Re: indexation UNIQUE   

Sujet

rss Flux RSS des derniers messages

Vous devez vous identifier pour pouvoir poser une question ou répondre.

ven. 09 août 2019, 20h42

Francis Faure
France 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
19 383 messages dans le forum • Liste complète des messages

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2019.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3