[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.

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

Messagepar shawa » 17 Juil 2021 18:03

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/Documentation/HSQLDB_Guide/ch09#ALTER_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?

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
Pièces jointes
Relations_commandes.jpg
LibreOffice Version: 6.4.7.2 sous Mint
Avatar de l’utilisateur
shawa
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 21 Nov 2018 20:43

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

Messagepar jeanmimi » 17 Juil 2021 19:40

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 : 7.2 (x64)(22 août 2021)
Adoptopen JRE ou Oracle JRE (x64) 1.8.0_xxx, Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 16041
Inscrit le : 03 Mars 2006 17:02
Localisation : Venise verte

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

Messagepar HRk2o » 18 Juil 2021 19:10

Bonjour Shawa,

Ou dois-je repenser la structure des tables?


je verrai plutôt la structure de cette façon !

Capture d’écran.png


@+
AOO 4.19 et LO 6.4.5 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.19 et LibO 6.1.5.2
HRk2o
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 285
Inscrit le : 29 Mai 2009 09:51
Localisation : Guyane

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

Messagepar jeanmimi » 18 Juil 2021 20:01

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.
Pièces jointes
Base_Suivi_Commandes_v3.odb
(22.84 Kio) Téléchargé 19 fois
LibreOffice : Version : 7.2 (x64)(22 août 2021)
Adoptopen JRE ou Oracle JRE (x64) 1.8.0_xxx, Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 16041
Inscrit le : 03 Mars 2006 17:02
Localisation : Venise verte

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

Messagepar shawa » 20 Juil 2021 13:26

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   AgrandirRéduire
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
shawa
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 21 Nov 2018 20:43

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

Messagepar jeanmimi » 20 Juil 2021 17:04

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.
Pièces jointes
Clé primaire et Index sur deux autres champs.jpg
LibreOffice : Version : 7.2 (x64)(22 août 2021)
Adoptopen JRE ou Oracle JRE (x64) 1.8.0_xxx, Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 16041
Inscrit le : 03 Mars 2006 17:02
Localisation : Venise verte

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

Messagepar shawa » 21 Juil 2021 10:21

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
shawa
Fraîchement OOthentifié
 
Message(s) : 8
Inscrit le : 21 Nov 2018 20:43

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

Messagepar jeanmimi » 21 Juil 2021 19:29

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.
Pièces jointes
Clé primaire et Index.jpg
LibreOffice : Version : 7.2 (x64)(22 août 2021)
Adoptopen JRE ou Oracle JRE (x64) 1.8.0_xxx, Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 16041
Inscrit le : 03 Mars 2006 17:02
Localisation : Venise verte


Retour vers Base de données

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 5 invité(s)