base: création de table: Saisie unique

Bonjour. Je cherche depuis 3H maintenant comment rendre unique la saisie d’un champ. Je m’explique:
J’ai une liste de livres, mais je ne voudrais pas faire de doublon. Comment éviter les saisies en trop ?
Merci de votre aide.

Bonjour @thierryR

Ta demande ne m’est pas très claire… Garantir l’unicité d’un livre se fait en saisissant son isbn. Il peut y avoir plusieurs livres ayant le même titre.

C’est donc sur le champ isbn qu’il faudra, soit définir la clé primaire, soit (cas de figure que je n’imagine pas vraiment) si ce n’est pas le champ clé primaire, il est possible dans l’interface de définir un index unique sur un (ou plusieurs) champ(s). Pour cela, lors de la création/modification de la table passer par le menu OutilsÉbauche d'index (également accessible via la barre d’outils).

Cordialement

Désolé, je ne cherche pas si compliqué. C’est un usage familial exclusivement. C’est ma première base avec libreoffice.

Bonjour @thierryR

Lors de la création de la table, vous pouvez utiliser la contrainte UNIQUE. Je ne sais pas faire cela via l’interface utilisateur graphique mais en SQL.

Inspirez-vous de ma réponse dans cet échange pour régler votre problème.

Ajout

Non, ce n’est pas au niveau du formulaire qu’il faut agir mais au niveau de la nature du champ titre_livre. Le formulaire est un outil de Base. Le champ est une composante d’une table qui est gérée par le moteur HSQLDB ou Firebird qui utilisent le langage SQL. La contrainte UNIQUE est un élément du langage SQL.

Après sauvegarde de vos données, je vous propose 1°) de rechercher si 2 enregistrements de votre base que j’appellerai t_livres (à vous de remplacer par le vrai nom) ont le même nom et 2°) d’ajouter une contrainte UNIQUE au champ titre_livre.

1°) Ouvrir la console SQL de la base de données par Outils>SQL... et saisir la commande suivante dans le volet du haut

SELECT COUNT(*), "titre_livre" 
FROM "t_livres"
GROUP BY "titre_livre" 
HAVING COUNT(*) >1

Cochez la case "Afficher la sortie des instructions “select” et cliquez sur le bouton Exécuter.

Cette requête de sélection ne modifie pas les données. Elle effectue un regroupement sur la base du champ “titre_livre” et décompte le nombre d’enregistrements pour chacune des valeurs de “titre_livre”. Ensuite, elle n’affiche que ceux dont le nombre dépasse 1, c’est-à-dire les doublons ou triplons.

Cette étape est importante car l’ajout d’une contrainte UNIQUE échouera avec un message d’erreur du genre

1: Violation of unique index SYS_IDX_nom_unique_49: duplicate value(s) for column(s) "titre_livre" in statement [ALTER TABLE "t_livres" ADD CONSTRAINT "nom_unique" UNIQUE ("titre_livre")]

Il vous faut d’abord vous assurer de leur absence par un traitement éventuel des doublons.

Si des doublons apparaissent, il faudra en noter les noms et différencier les titres afin de les différencier.

Si vous avez enregistré les différents tomes d’un ouvrage sous le même titre, ils vont apparaître en doublon. Il faudrait alors considérer de créer une contrainte sur plusieurs champs : l’unicité étant imposé, par exemple au couple “titre_livre”, “tome”, en considérant que le champ qui différencie les tomes se nomme “tome”. Dans ce cas, modifier la requête de détection des doublons pour

SELECT COUNT(*), "titre_livre", "tome" 
FROM "t_livres"
GROUP BY "titre_livre", "tome"
HAVING COUNT(*) >1

La détection des doublons ci-dessus souffre de quelques faiblesses et ne révélera pas les doublons dont les graphies diffèrent comme “les miserables” et “Les Misérables”. La détection de ce genre de doublon étant difficile, il vous appartient d’uniformiser la graphie de vos données pour éviter de vous faire des nœuds au cerveau par la suite. Pour cela, une aide peut être trouvée en listant tous vos ouvrages par ordre alphabétique des titres écrits en minuscules, par

SELECT (*)
FROM "t_livres"
ORDER BY ( LOWER ( "titre_livre" ) ) ASC

Pour aider à mieux lire les résultats, créer une requête R_Liste_titres_minuscule, en mode SQL pour obtenir des résultats sous forme tabulaire, plus lisible que dans la console. Pour cela, Insertion>Requête (mode SQL...). Saisissez la requête ci-dessus et enregistrez-la.

2°) Dans la même console , exécutez la commande suivante, en l’absence de gestion des tomes :

ALTER TABLE "t_livres" ADD CONSTRAINT "nom_unique" UNIQUE ("titre_livre")

Si gestion des tomes

ALTER TABLE "t_livres" ADD CONSTRAINT "nom_unique" UNIQUE ("titre_livre","tome")

Pour montrer à la communauté que la question a trouvé sa réponse, cliquez sur ✓ à côté de la “bonne” réponse, et “votez” en cliquant sur la flèche ^ de toute réponse utile. Ce sont les mécanismes utilisés pour communiquer la qualité des questions et réponses sur ce site. Merci!

Pour tout complément d’information, utilisez les boutons situés en dessous de votre question et éditez votre question ou simplement ajouter un commentaire. SVP ! Ne répondez pas à votre propre question à moins d’y apporter une réelle réponse.

Cordialement, Michel

Merci pour ces précieux conseils. J’ai trouvé le moyen de travailler les tables en SQL. J’ai simplement voulu ajouter un index unique à ma table LIVRES
J’ai essayé:

ALTER TABLE "LIVRES"  ADD CONSTRAINT  "nom_unique" UNIQUE ("titre_livre")

Ça occasionne une erreur de syntaxe, mais je ne comprends pas laquelle.
J’ai donc cherché le plus simple possible:

   ALTER TABLE "LIVRES" ADD UNIQUE ( "titre_livre")

Ça occasionne une erreur de syntaxe aussi.

Quel est le message d’erreur ?

Erreur de syntaxe dans l’expression SQL /builddir/build/BUILD/libreoffice-7.0.3.1/dbaccess/source/core/api/SingleSelectQueryComposer.cxx:108

@thierryR

Je pense que la 2e requête n’a pas de chance de pouvoir être correctement interprétée. Le message d’erreur comprend SingleSelectQueryComposer qui est un outil d’analyse des requêtes SELECT. Je ne vois pas le rapport avec une requête de modification de table ALTER TABLE...

Le message fournit est bien celui pour la requête complète ?

Accessoirement, je déduis du message d’erreur l’emploi de la version 7.0.3. Il serait peut-être préférable d’utiliser la version stable 6.4.7. Cela éviterait de cumuler les erreurs dues à nos erreurs de manipulation de Base aux bogues de jeunesse de la version 7.0.3.

Quel moteur : HSQLDB intégré, Firebird ?

Oui c’est HSQLDB intégré.

Message d’erreur de la première requête ?

Intention de tester LO6.4.7 ?

y a-t-il déjà des titres dans la table ? car s’il y a déjà un doublon, il ne sera pas possible d’y appliquer la contrainte unique.

Non, il n’ y a pas de doublons, et je veux les en empêcher.

Ça fonctionne si on passe par le menu outils/SQL. = OK
J’étais passé par insertion/requète SQL = KO

Bonsoir @thierryR

Merci pour ces précisions.

J’en déduis que vous avez résolu votre problème par la création d’une contrainte unique. Pour montrer à la communauté que la question a trouvé sa réponse, cliquez sur ✓ à côté de la “bonne” réponse. C’est le mécanisme utilisé pour communiquer la qualité des questions et réponses sur ce site. Merci!

Cordialement, Michel

Pas trouvé.

Quelques cm en dessous de cette ligne, tout à gauche, un rond sous la flèche vers le bas, elle-même sous le zéro.

Voilà la réponse dans un cadre rouge: >20 points requis pour accepter ou non accepter votre propre réponse
(cliquez pour fermer)

Oui, vous ne pouvez accepter votre réponse mais vous pouvez accepter celles des autres. La mienne est juste en dessous. Merci d’avance !