[Résolu] Auto incrément sur champ qui n'est pas clé primaire

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
Avatar de l’utilisateur
shawa
Fraîchement OOthentifié
Messages : 8
Inscription : 21 nov. 2018 19:43

[Résolu] Auto incrément sur champ qui n'est pas clé primaire

Message par shawa »

Bonjour à tous,
Une partie de ma base est conçue selon l'image ci-dessous.
Je butte sur le problème suivant:
  • Un client ne peut passer qu'une commande par jour: d'où la clé composée id_client + Jour_commande dans la table "Commandes".
    La commande peut être composée de plusieurs produits dont le détail est dans la table "Détails_commande". Le lien se fait donc via Id_commande.
Lors de la création d'une commande, je souhaiterais donc que le champ id_commande soit généré en auto-incrément pour ne pas avoir à le faire moi-même et assurer ainsi une unicité de id_commande.
Je n'arrive pas à le faire avec l'interface Base. Je n'ai pas trouvé d'exemple de ce cas.
Les colonnes avec l'attribut IDENTITY sont auto-incrémentées. Elles doivent être de type INTEGER ou BIGINT et sont automatiquement définies comme clé primaire (en conséquence, les clés primaires sur plusieurs colonnes ne sont pas autorisées lorsque une colonne IDENTITY est présente dans la table).
https://wiki.openoffice.org/wiki/FR/Doc ... LTER_TABLE
Je ne vois pas ce qu'est Identity, la différence avec Primary Key? Il est question à un endroit de CREATE SEQUENCE où l'incrémentation n'est pas liée à Identity ou Primary Key, est-ce une piste?
Relations_commandes.jpg
En bref:
Il y a-t-il une solution technique (via sql notamment)?
Ou dois-je repenser la structure des tables?

Merci pour vos éclaircissements.

Shawa
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice Version: 6.4.7.2 sous Mint
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16959
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Auto incrément sur un champ qui n'est pas clé primaire

Message par jeanmimi »

La documentation explicite la notion IDENTITY :
http://www.hsqldb.org/doc/2.0/guide/dat ... chapt.html
et dit :
" Identity Auto-Increment Columns
Each table can contain a single auto-increment column, known as the IDENTITY column. An IDENTITY column is a SMALLINT, INTEGER, BIGINT, DECIMAL or NUMERIC column with its value generated by a sequence generator.
etc
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

Re: Auto incrément sur un champ qui n'est pas clé primaire

Message par HRk2o »

Bonjour Shawa,
Ou dois-je repenser la structure des tables?
je verrai plutôt la structure de cette façon !
Capture d’écran.png
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16959
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Auto incrément sur un champ qui n'est pas clé primaire

Message par jeanmimi »

shawa a écrit :Une partie de ma base est conçue selon l'image ci-dessous.
La Table Commandes n'est pas conforme : comme le montre HRk2o, c'est ID_Commande qui devrait être la Clé Primaire en Auto-Valeur.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
shawa
Fraîchement OOthentifié
Messages : 8
Inscription : 21 nov. 2018 19:43

Re: Auto incrément sur un champ qui n'est pas clé primaire

Message par shawa »

Bonjour à vous,
Merci pour vos réponses.
Je disais dans mon premier message, qu'une des contraintes souhaitée est
Un client ne peut passer qu'une commande par jour: d'où la clé composée id_client + Jour_commande dans la table "Commandes".
Dans l'exemple de HRk2o, il y a la possibilité pour un même client de passer 2 fois commande la même journée.

Pourtant dans la documentation fournie par Jeanmimi, il y a bien écrit In HyperSQL 2.x, an IDENTITY column is not by default treated as the primary key for the table (as a result, multi-column primary keys are possible with an IDENTITY column present). où je comprends qu'il est possible d'avoir une clé composée avec une colonne identity.

J'essaie de créer les choses par commande SQL, sans succès:

Code : Tout sélectionner

CREATE TABLE  "Test" ("Jour_commande" DATE PRIMARY KEY, "Id_commande" INTEGER  IDENTITY)
retourne qu'il y a tentative de créer une deuxième clé primaire avec Id_commande.

Pouvez-vous m'aider?
LibreOffice Version: 6.4.7.2 sous Mint
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16959
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Auto incrément sur un champ qui n'est pas clé primaire

Message par jeanmimi »

Après avoir continué à chercher après ton dernier post,
shawa a écrit :il est possible d'avoir une clé composée avec une colonne identity
en passant la Table en Mode Édition, l’Assistant permet de créer un Index sur les autres champs de la Table.
J'ai testé : l'insertion d'un ID_Client sur la même date est impossible; conséquence, un client ne peut pas passer deux commandes la même journée.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
shawa
Fraîchement OOthentifié
Messages : 8
Inscription : 21 nov. 2018 19:43

Re: Auto incrément sur un champ qui n'est pas clé primaire

Message par shawa »

Merci Jeanmimi, ça fonctionne.
2 petites choses:
  • Sur ta copie d'écran, dans l'index, tu n'as que l'index que tu viens de créer. Or, de mon côté, j'ai aussi l'index relatif à la clé primaire (du style SYS_IDX_48). C'est normal?
    Où as-tu trouvé cette info? sur quelle doc?
LibreOffice Version: 6.4.7.2 sous Mint
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16959
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Auto incrément sur un champ qui n'est pas clé primaire

Message par jeanmimi »

shawa a écrit :de mon côté, j'ai aussi l'index relatif à la clé primaire (du style SYS_IDX_48)
Après sauvegarde, puis fermeture et réouverture, j'ai bien comme toi les 2 index : celui de la Clé primaire en Auto-Valeur et celui créé avec les deux autres champs ID_Client et Date.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox