IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Double clés primaires avec auto-increment sur une


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 27
    Par défaut Double clés primaires avec auto-increment sur une
    Bonjour,
    J'ai un petit problème dans la conception d'une table. Je gérais ça directement dans mon code avant mais ça doit être faisable en SQL directement.

    Mes tables concernées :
    Table Commande composé d'un id (PK auto-increment)
    Table CommandeListe composé d'un id et de l'idCommande les deux en PK. J'aimerais que l'id de CommandeListe recommence à 1 à chaque nouveaux idCommande.
    Actuellement j'ai :
    Table Commande
    id
    1
    2

    Table CommandeListe
    id | idCommande
    1 | 1
    2 | 1
    3 | 1
    4 | 2
    5 | 2

    Je souhaite avoir :
    Table Commande
    id
    1
    2

    Table CommandeListe
    id | idCommande
    1 | 1
    2 | 1
    3 | 1
    1 | 2
    2 | 2

    Est-ce que il y a une manip directement dans le Créateur visuel SQL Server pour faire ça ? Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Fonctionnellement, quel est le rôle de la table "CommandeListe" ?
    S'il s'agit des lignes de commande (détail commande) il serait préférable de définir comme PK en 1er l'id commande et en 2ème l'id ligne, de façon à regrouper les lignes avec la commande
    Vos requêtes seront plus optimisées

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 27
    Par défaut
    Bonjour,

    Oui la table CommandeListe comporte tous les éléments de la commande.
    Ce que tu as décris est exactement ce que je veux faire, j'avais juste inversé les id. Mais je ne sais justement pas comment faire ! Je reprends :

    Actuellement :
    Table Commande
    id
    1
    2

    Table CommandeListe
    idCommande | id
    1 | 1
    1 | 2
    1 | 3
    2 | 4
    2 | 5
    2 | 6

    Je souhaite avoir :
    Table Commande
    id
    1
    2

    Table CommandeListe
    idCommande | id
    1 | 1
    1 | 2
    1 | 3
    2 | 1
    2 | 2
    2 | 3

    Je souhaiterais que lors de mes INSERT INTO je ne renseigne que l'idCommande et que l'id lui soit généré automatiquement en auto increment en fonction de l'idCommande. En gros je peux avoir 2 id similaire si leurs idCommande sont différents.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Dans ce cas il faut le faire manuellement, mais c'est juste stupide. Cela n'a aucun sens !
    En effet, si vous numérotez de manière relative, par exemple commande 1 , ligne 1, 2, 3, commande 2, ligne 1, 2, 3, 4 et qu'il y a une erreur sur une commande... Que doit-il se passer si l'on doit supprimer une ligne de la commande, par exemple la ligne 2 ?

    SI vous voulez que vos lignes "apparaissent" numérotées de manière relative, c'est possible de lafaire dans une vue à l'aide de la fonction de fenêtrage ROW_NUMBER, par exemple comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *, ROW_NUMBER() OVER(PARTITION BY id_commande ORDER BY id_ligne) AS numero_ligne
    FROM   tableCommande JOIN tableLigne...
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 27
    Par défaut
    Pourquoi est-ce stupide ? Si je souhaite supprimer la ligne 2 d'une commande j'ai juste à faire un delete where ligne = 2 and idCommande = 'XX'
    Vous me conseillez donc d'identifier une ligne de commande avec un identifiant unique ?

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    En fait l'identifiant est une clé non-sémantique, qui cible de façon déterministe une ligne de la table, et qui supporte très bien les jointures.

    Vous avez une table de commandes et probablement une table d'articles; la table CommandeListe représente donc la relation entre ces deux tables, puisque :
    • une commande peut compter plusieurs articles
    • un article peut être référencé dans plusieurs commandes


    Dès lors il serait plus intéressant de qualifier la relation à l'aide d'un numéro de ligne, si vous vous en servez dans l'application pour présenter les données dans un certain ordre.
    Lors de la suppression d'un article, on supprime la ligne, et éventuellement on change le numéro de ligne.

    Table CommandeListe
    idCommandeListe | idCommande | idArticle | numero_ligne
    1 | 1 | 1 | 1
    2 | 1 | 8 | 2
    3 | 1 | 12 | 3
    4 | 2 | 54 | 1
    5 | 2 | 48 | 2
    6 | 3 | 2 | 1
    7 | 4 | 8 | 1
    8 | 4 | 7 | 2
    9 | 4 | 9 | 3

    @++

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par gunxi3 Voir le message
    Pourquoi est-ce stupide ? Si je souhaite supprimer la ligne 2 d'une commande j'ai juste à faire un delete where ligne = 2 and idCommande = 'XX'
    Vous me conseillez donc d'identifier une ligne de commande avec un identifiant unique ?
    Et dans ce cas vous ne respectez pas votre cahier des charges initiale qui est une identification relative continue. Il faudrait donc en sus réajuster les clefs des lignes en dessous de la valeur 2...
    Je laisse à votre sagacité le soin de trouver la requête MERGE pour se faire !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simuler un comportement en auto increment sur une colonne
    Par abc.xyz dans le forum Administration
    Réponses: 18
    Dernier message: 20/08/2015, 15h14
  2. Définir la valeur de l'auto increment sur une base Access
    Par CardinalJo dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/07/2013, 22h24
  3. Ajout de clé primaire avec auto increment
    Par methodman225 dans le forum SQL
    Réponses: 4
    Dernier message: 04/07/2013, 09h10
  4. Auto Increment sur une propriété
    Par ElSkud dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/06/2008, 18h14
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo