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

Schéma Discussion :

Meilleures méthode pour une table de liaison


Sujet :

Schéma

  1. #21
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    @escartefigue, PER_ID de la tables T_PERSONNES est bien attribué par le SGBD en numérotation auto. C'est après que je suis perdu car je ne sais pas comment dissocier clients et employés lors de la création de fiches...

    Pour faire mes tests, j'utilise l'intégré de LO Base, vu tous les essais que je fais à l'intérieur (de plus, j'ai des soucis de connexion Base/MySql, mais c'est un autre sujet). Le script est donc adapté en conséquence...

  2. #22
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Si "client" et "employé" sont des sous-types de "personne" alors il n'y a pas à se préoccuper de leur identifiant : celui-ci sera hérité du surtype "personne"

  3. #23
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Voilà le souci.

    Je crée un formulaire employés et je saisis les caractéristiques du premier employé (donc, colonnes "personne" + colonnes "employé"). Comme on le voit sur cette copie, ça a l'air ok. Une fois saisi le numéro SS, le PER_ID de la table employés se met à jour.



    Je crée ensuite un second formulaire, pour les clients, basé sur la même structure. Je veux créer mon premier client, et là, évidemment, si je suis la logique des relations, la place est prise par le premier employé, qui attend un numéro de client qui n'a pas lieu d'être.



    Est-ce que mon script SQL est correct ? Parce que là il manque un truc ou alors c'est le formulaire qui est en cause mais je ne vois pas comment faire autrement. Dans la table personnes, j'ai bien 2 personnes, dans la table clients j'en ai une et une également dans la table employés.


  4. #24
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    De ce que j'ai compris des réponses précédentes, une personne physique est soit un client, soit un employé, mais jamais les deux.
    Donc, il n'y a aucune raison, lors de l'affichage du formulaire client, de conserver les éléments issus du formulaire employé.

    De plus, sur ces deux formulaires en mode création, le champ "PER_ID" ne devrait pas être saisissable puisqu'il correspond à une colonne dont la valeur est affectée par le SGBD. La valeur devrait être affichée après validation par l'utilisateur.

  5. #25
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Le champ n'est effectivement pas saisissable : je l'ai juste inséré dans le formulaire pour voir qu'il se mettait bien à jour.

  6. #26
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonjour François,
    Citation Envoyé par fsmrel Voir le message
    En utilisant la notation “patte d’oie” quand même moins pauvre (présence cette fois-ci des cardinalités minimales) :

    Pièce jointe 582583
    Une petite question relative à cette notation "crow's foot" : pour la représentation des MLD, vu que la notation permet de préciser les cardinalités minimales à 0, quel est l'intérêt des liaisons en pointillés ?
    Au niveau MLD, je ne vois que 6 cas de liaison : 1,1---1,N / 0,1---1,N / 1,1---0,N / 0,1---0,N / 0,1---0,1 / 0,1---1,1
    Merci pour ton éclairage !
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  7. #27
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    De ce que j'ai compris des réponses précédentes, une personne physique est soit un client, soit un employé, mais jamais les deux.
    Donc, il n'y a aucune raison, lors de l'affichage du formulaire client, de conserver les éléments issus du formulaire employé.
    Oui, soit l'un soit l'autre, mais comme tel quel il n'y a rien pour filtrer, les données de l'un s'affichent chez l'autre et vice-versa, conformément aux relations.

  8. #28
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    J'arrive à quelque chose mais je ne crois pas que ce soit la bonne méthode.

    Dans la table T_PERSONNES j'ai ajouté une colonne PER_TY_ID.
    J'ai crée une table T_PERSONNES_TY avec comme colonnes PER_TY_ID et PER_LIB.
    J'ai pris comme assignations 1 pour les employés et 2 pour les clients.

    Dans la propriété de filtrage de chaque formulaire :

    ( "T_PERSONNES"."PER_TY_ID" = 1 ) pour les employés.
    ( "T_PERSONNES"."PER_TY_ID" = 2 ) pour les clients.

  9. #29
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Paprick
    Une petite question relative à cette notation "crow's foot" : pour la représentation des MLD, vu que la notation permet de préciser les cardinalités minimales à 0, quel est l'intérêt des liaisons en pointillés ?
    Dans MySQL Workbench, les liens pleins sont les "identifying relationships". Cas typique : table associative. Les autres sont pour les clés étrangères simples.

    Donc...
    A -0,n----association----0,n- B => Table associative avec trait plein => A -||----o< table_associative >o|----||- B
    A -0,n----association----1,1- B => Association avec trait pointillé => A -||- - - -o< B

    Nota : les multiplicités se lisent comme en UML, à l'envers du MCD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #30
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonsoir Philippe,
    Citation Envoyé par CinePhil Voir le message
    Dans MySQL Workbench, les liens pleins sont les "identifying relationships". Cas typique : table associative. Les autres sont pour les clés étrangères simples.
    Donc...
    A -0,n----association----0,n- B => Table associative avec trait plein => A -||----o< table_associative >o|----||- B
    A -0,n----association----1,1- B => Association avec trait pointillé => A -||- - - -o< B
    Dans le cas A -0,n----association----1,1- B, en quoi la notation avec trait plein A - ||----o< B est-elle différente ? le "o" signifie clairement le côté optionnel, les pointillés n'apportent rien de plus, non ?
    C'est peut-être lié au fait que la clé étrangère devient clé primaire dans le cas des tables associatives ?
    Et donc, le trait plein correspondrait aux liens avec identifiant relatif ?
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  11. #31
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Paprick Voir le message
    Et donc, le trait plein correspondrait aux liens avec identifiant relatif ?

    Affirmatif Sherlock.

    Je cite Philippe :

    Dans MySQL Workbench, les liens pleins sont les "identifying relationships".

    Autrement dit, il s’agit de la technique mise en oeuvre par MySQL Workbench pour l’identification relative. Je te renvoie à ce sujet au paragraphe 5 de mon article de 2014 sur MySQL Workbench.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  12. #32
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Autrement dit, il s’agit de la technique mise en œuvre par MySQL Workbench pour l’identification relative.
    C'est une représentation standard ou c'est propre à MySQL Workbench ?
    Est-ce suffisamment répandu pour s'y intéresser pour Looping 3.1 ?
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  13. #33
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Paprick Voir le message
    C'est une représentation standard ou c'est propre à MySQL Workbench ?
    Est-ce suffisamment répandu pour s'y intéresser pour Looping 3.1 ?
     
    C’est une représentation propre à MySQL Workbench (qui se situe en fait au niveau MLD) : aucun intérêt pour Looping au niveau MCD. A voir au niveau MLD, a priori je ne dis pas non...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  14. #34
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Nerva Voir le message
    PER_ID de la tables T_PERSONNES est bien attribué par le SGBD en numérotation auto.
    Quel est donc le nom de ce mystérieux SGBD ?

    En effet, comme le dit Escartefigue, on dirait qu’il s’agit de DB2, mais PostgreSQL ne rechigne pas à utiliser "GENERATED ALLWAYS as identity" par exemple pour les OID (cf. instruction « CREATE TABLE » dans la doc : PostgreSQL 12.4 Documentation.



    Cela dit :

    Citation Envoyé par Nerva Voir le message
    Pour faire mes tests, j'utilise l'intégré de LO Base, vu tous les essais que je fais à l'intérieur (de plus, j'ai des soucis de connexion Base/MySql, mais c'est un autre sujet). Le script est donc adapté en conséquence...
    J’ignore tout de LO base. Quoi qu’il en soit exécutez-vous votre script avec MySQL ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  15. #35
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    C’est une représentation propre à MySQL Workbench (qui se situe en fait au niveau MLD) : aucun intérêt pour Looping au niveau MCD. A voir au niveau MLD, a priori je ne dis pas non...
    L'idée serait de proposer cette représentation en option pour le MLD graphique.
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  16. #36
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Paprick Voir le message
    L'idée serait de proposer cette représentation en option pour le MLD graphique.
    Bien que mes diagrammes soient en noir et blanc, en l’occurrence mes penchants artistiques me feraient plutôt pencher pour une jolie couleur, genre bleu royal 
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  17. #37
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Nerva Voir le message
    je suis perdu car je ne sais pas comment dissocier clients et employés lors de la création de fiches...
    Voyons comment procéder au moins avec MySQL seul...

    Tout d’abord, vous ne pouvez pas créer de clé alternative pour la table PERSONNE au moyen d’une combinaison des attributs naturels PER_NOM, PER_PRENOM, PER_DATE_NAIS, PER_DATE_ENTREE, car rien n’interdit que deux personnes puissent avoir même nom, même prénom, être nées le même jour et avoir été embauchées le même jour. Autrement dit effectuer des SELECT dans les tables dépendant de PERSONNE n’est pas déterministe, c’est quand même embêtant...

    Le plus sage est de mettre en oeuvre un code (attribut PER_CODE ci-dessous) qui soit clé alternative.

    Allons-y :

    CREATE TABLE TITRE
    ( 
       TIT_ID               INT AUTO_INCREMENT,
       TIT_LIB              VARCHAR(4) NOT NULL,
       CONSTRAINT T_TITRES_PK PRIMARY KEY(TIT_ID),
       CONSTRAINT T_TITRES_AK UNIQUE(TIT_LIB)
    );
    
    INSERT INTO TITRE (TIT_LIB) 
    VALUES
        ('Mme'), ('M.'), ('Mlle'), ('Dr'), ('Me')
    ;
    SELECT TIT_LIB FROM TITRE ;
    =>

    TIT_LIB
    Mme
    M.
    Mlle
    Dr
    Me 

    CREATE TABLE PERSONNE 
    (
       PER_ID               INT AUTO_INCREMENT,
       PER_CODE             CHAR(8) NOT NULL,   
       TIT_ID               INT NOT NULL,
       PER_NOM              VARCHAR(48) NOT NULL,
       PER_PRENOM           VARCHAR(48) NOT NULL,
       PER_DATE_NAIS        DATE NOT NULL,
       PER_DATE_ENTREE      DATE NOT NULL,
       CONSTRAINT PERSONNE_PK PRIMARY KEY (PER_ID),
       CONSTRAINT PERSONNE_AK UNIQUE (PER_CODE),   
       CONSTRAINT PERSONNE_TITRE_FK FOREIGN KEY(TIT_ID) REFERENCES TITRE (TIT_ID)
    );
    
    INSERT INTO PERSONNE (PER_CODE, PER_NOM, PER_PRENOM, PER_DATE_ENTREE, PER_DATE_NAIS, TIT_ID) 
    VALUES
        ('NAU00001', 'Naudin', 'Fernand', '1962-10-21', '1919-07-14',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('VOL00001', 'Volfoni', 'Raoul', '1962-12-14', '1916-01-11',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('VOL00002', 'Volfoni', 'Paul', '1962-12-14', '1919-10-03',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('FOL00001', 'Folace', 'Francis', '1962-10-22', '1921-07-20', (SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'Me'))
      , ('JEA00001', 'Jean', 'Jean', '1962-10-22', '1903-07-19',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('PAT00001', 'Patricia', 'Patricia', '1962-10-22', '1942-08-18',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'Mlle'))
      , ('ANT00001', 'Antoine', 'Delafoy', '1962-10-22', '1929-02-08',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('PAS00001', 'Pascal', 'Pascal', '1963-01-07', '1930-04-17',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('BAS00001', 'Bastien', 'Mac', '1963-01-07', '1913-06-20',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('THE00001', 'Théo', 'Théo', '1963-01-07', '1929-07-28',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
      , ('MAD00001', 'Mado', 'Mado', '1963-01-07', '1919-01-27',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'Mme'))
      , ('TOM00001', 'Tomate', 'Tomate', '1962-12-21', '1914-07-22',(SELECT TIT_ID FROM TITRE WHERE TIT_LIB = 'M.'))
    ;
    SELECT PER_CODE, TIT_LIB, PER_NOM, PER_PRENOM, PER_DATE_ENTREE, PER_DATE_NAIS   
    FROM PERSONNE as x JOIN TITRE as y ON x.TIT_ID = y.TIT_ID
    ;
    =>

    PER_CODE   TIT_LIB PER_NOM, PER_PRENOM  PER_DATE_ENTREE   PER_DATE_NAIS
    NAU00001   M.    Naudin     Fernand     1962-10-21        1919-07-14
    VOL00001   M.    Volfoni    Raoul       1962-12-14        1916-01-11
    VOL00002   M.    Volfoni    Paul        1962-12-14        1919-10-03
    FOL00001   Me    Folace     Francis     1962-10-22        1921-07-20
    JEA00001   M.    Jean       Jean        1962-10-22        1903-07-19
    PAT00001   Mlle  Patricia   Patricia    1962-10-22        1942-08-18
    ANT00001   M.    Antoine    Delafoy     1962-10-22        1929-02-08
    PAS00001   M.    Pascal     Pascal      1963-01-07        1930-04-17
    BAS00001   M.    Bastien    Mac         1963-01-07        1913-06-20
    THE00001   M.    Théo       Théo        1963-01-07        1929-07-28
    MAD00001   Mme   Mado       Mado        1963-01-07        1919-01-27
    TOM00001   M.    Tomate     Tomate      1962-12-21        1914-07-22
    

    CREATE TABLE ADRESSE
    (
       ADR_ID               INT AUTO_INCREMENT,
       ADR_L1               VARCHAR(48) NOT NULL,
       ADR_L2               VARCHAR(48) NOT NULL,
       ADR_CP               CHAR(5) NOT NULL,
       ADR_LOC              VARCHAR(48) NOT NULL,
       PER_ID               INT NOT NULL,
       CONSTRAINT ADRESSE_PK PRIMARY KEY(ADR_ID),
       CONSTRAINT ADRESSE_PERSONNE_FK FOREIGN KEY(PER_ID) 
           REFERENCES PERSONNE (PER_ID)
    );
    
    INSERT INTO ADRESSE (PER_ID, ADR_CP, ADR_LOC, ADR_L1, ADR_L2) 
    VALUES 
        ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'NAU00001')
         , '75001', 'Paris', 'Ets Fernand Naudin', '3, rue en pente')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'VOL00001')
         , '75008', 'Paris', 'Volfoni frères', 'Quai des péniches')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'VOL00002')
         , '75008', 'Paris', 'Volfoni frères', 'Quai des péniches')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'FOL00001')
         , '75008', 'Paris', 'Aux bons soins des Ets Fernand Naudin', '3, rue en pente')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'JEA00001')
         , '75008', 'Paris', 'Aux bons soins des Ets Fernand Naudin', '3, rue en pente')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'PAS00001')
         , '75008', 'Paris', 'Chez Volfoni frères', 'Quai des péniches')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'BAS00001')
         , '75008', 'Paris', 'Chez Volfoni frères', 'Quai des péniches')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'MAD00001')
         , '75008', 'Paris', 'Chez Volfoni frères', 'Quai des péniches')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'PAT00001')
         , '75008', 'Paris', 'Chez M. Fernand Naudin', '3, rue en pente')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'ANT00001')
         , '75008', 'Paris', 'Chez M. Fernand Naudin', '3, rue en pente')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'TOM00001')
         , '78999', 'Trifoully', 'Chez Tomate', '5, rue des clandés')
    ;
    SELECT PER_CODE, ADR_CP, ADR_LOC, ADR_L1, ADR_L2   
    FROM ADRESSE as x JOIN PERSONNE as y ON x.PER_ID = y.PER_ID
    ;
    =>

    PER_CODE   ADR_CP  ADR_LOC     ADR_L1                                   ADR_L2
    NAU00001   75001   Paris       Ets Fernand Naudin                       3, rue en pente
    VOL00001   75008   Paris       Volfoni frères                           Quai des péniches
    VOL00002   75008   Paris       Volfoni frères                           Quai des péniches
    FOL00001   75008   Paris       Aux bons soins des Ets Fernand Naudin    3, rue en pente
    JEA00001   75008   Paris       Aux bons soins des Ets Fernand Naudin    3, rue en pente
    PAS00001   75008   Paris       Chez Volfoni frères                      Quai des péniches
    BAS00001   75008   Paris       Chez Volfoni frères                      Quai des péniches
    MAD00001   75008   Paris       Chez Volfoni frères                      Quai des péniches
    PAT00001   75008   Paris       Chez M. Fernand Naudin                   3, rue en pente
    ANT00001   75008   Paris       Chez M. Fernand Naudin                   3, rue en pente
    TOM00001   78999   Trifoully   Chez Tomate,                             5, rue des clandés
    

    CREATE TABLE TELEPHONE 
    (
       TEL_ID               INT AUTO_INCREMENT,
       TEL_NUM              CHAR(10) NOT NULL,
       PER_ID               INT NOT NULL,
       CONSTRAINT TELEPHONE_PK PRIMARY KEY(TEL_ID),
       CONSTRAINT TELEPHONE_PERSONNE_FK FOREIGN KEY (PER_ID) 
           REFERENCES PERSONNE (PER_ID)
    );
    
    INSERT INTO TELEPHONE (PER_ID, TEL_NUM)
    VALUES
        ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'NAU00001'), '0600000001')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'NAU00001'), '0600000002')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'VOL00001'), '0600000003')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'VOL00002'), '0600000004')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'FOL00001'), '0600000005')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'JEA00001'), '0600000006')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'JEA00001'), '0600000007')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'PAS00001'), '0600000008')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'BAS00001'), '0600000009')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'PAT00001'), '0600000010')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'ANT00001'), '0600000011')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'TOM00001'), '0600000012')
    ;
    SELECT PER_CODE, TEL_NUM   
    FROM TELEPHONE as x JOIN PERSONNE as y ON x.PER_ID = y.PER_ID
    ;
    =>

    PER_CODE   TEL_NUM
    NAU00001   0600000001
    NAU00001   0600000002
    VOL00001   0600000003
    VOL00002   0600000004
    FOL00001   0600000005
    JEA00001   0600000006
    JEA00001   0600000007
    PAS00001   0600000008
    BAS00001   0600000009
    PAT00001   0600000010
    ANT00001   0600000011
    TOM00001   0600000012
    

    CREATE TABLE EMPLOYE
    (
       PER_ID               INT NOT NULL,
       EMP_NUM_SS           CHAR(15) NOT NULL,
       CONSTRAINT  EMPLOYE_PK PRIMARY KEY (PER_ID),
       CONSTRAINT  EMPLOYES_AK UNIQUE (EMP_NUM_SS),
       CONSTRAINT  EMPLOYE_PERSONNE_FK FOREIGN KEY (PER_ID) 
           REFERENCES PERSONNE (PER_ID)
           ON DELETE CASCADE
    );
    
    INSERT INTO EMPLOYE (PER_ID, EMP_NUM_SS)
    VALUES
        ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'NAU00001'), '119078200000783')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'FOL00001'), '121077500514586')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'JEA00001'), '103077937012355')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'PAT00001'), '242085700200444')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'ANT00001'), '129026700014801')
    ;
    SELECT PER_CODE, PER_NOM, PER_PRENOM, EMP_NUM_SS
    FROM   PERSONNE as x JOIN EMPLOYE as y ON x.PER_ID = y.PER_ID
    ;
    =>

    PER_CODE    PER_NOM    PER_PRENOM    EMP_NUM_SS
    JEA00001    Jean       Jean          103077937012355
    NAU00001    Naudin     Fernand       119078200000783
    FOL00001    Folace     Francis       121077500514586
    ANT00001    Antoine    Delafoy       129026700014801
    PAT00001    Patricia   Patricia      242085700200444
    

    CREATE TABLE CLIENT
    (
       PER_ID               INT NOT NULL,
       CLI_NUM              VARCHAR(16) NOT NULL,
       CONSTRAINT CLIENT_PK PRIMARY KEY (PER_ID),
       CONSTRAINT CLIENT_AK UNIQUE (CLI_NUM),
       CONSTRAINT CLIENT_PERSONNE_FK FOREIGN KEY (PER_ID) 
           REFERENCES PERSONNE (PER_ID)
           ON DELETE CASCADE
    );
    INSERT INTO CLIENT (PER_ID, CLI_NUM)
    VALUES
        ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'VOL00001'), '0007')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'VOL00002'), '0008')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'PAS00001'), '0014')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'BAS00001'), '0015')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'MAD00001'), '0020')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'THE00001'), '0035')
      , ((SELECT PER_ID FROM PERSONNE WHERE PER_CODE = 'TOM00001'), '0048')
    ;
    SELECT PER_CODE, PER_NOM, PER_PRENOM, CLI_NUM
    FROM   PERSONNE as x JOIN CLIENT as y ON x.PER_ID = y.PER_ID
    ;
    =>

    PER_CODE    PER_NOM    PER_PRENOM      CLI_NUM
    VOL00001    Volfoni    Raoul           0007
    VOL00002    Volfoni    Paul            0008
    PAS00001    Pascal     Pascal          0014
    BAS00001    Bastien    Mac             0015
    MAD00001    Mado       Mado            0020
    THE00001    Théo       Théo            0035
    TOM00001    Tomate     Tomate          0048
    
    Essayez ça, déjà...

    L’attribut PER_CODE devrait vous aider, vous nous direz.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  18. #38
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Quel est donc le nom de ce mystérieux SGBD ?
    Je réponds déjà à ça.

    LO Base utilise le système de BD HSQLDB http://hsqldb.org qui a ses spécificités ; et pour paramétrer l'insertion de numéro auto, c'est GENERATED BY DEFAULT AS IDENTITY qu'il faut placer dans le script, en spécifiant un numéro de départ car par défaut, l'incrémentation commence à zéro. Pour une table toute fraîche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1)
    Les AUTO_INCREMENT ou autres ne sont pas pris en compte, et d'ailleurs, dans l'outil SQL de LO Base, cette option génère une erreur.

    Pareil pour les CONSTRAINT qui ont pour référence une clé étrangère. Je ne suis pas encore parvenu à les désactiver (genre SET FOREIGN_KEY_CHECKS = 0) lors de la génération d'une série complète de tables et c'est pour cette raison que je crée ces contraintes en ALTER TABLE, après la création des tables (et après leur remplissage, le cas échéant).

  19. #39
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Chaque SGBD a sa propre syntaxe pour gérer les identifiants attribués par le SGBD.

    Comme je l'avais remarqué plus haut dans le fil de discussion, la syntaxe choisie par LO base est exactement la même que celle de DB2 for Z/OS. Amusant
    DB2 propose également des options permettant de définir le comportement si la valeur maximale est atteinte (abend ou on redémarre à la valeur initiale) et permet de choisir le mode de distribution des identifiants (par défaut par paquet de 20 pour éviter de solliciter le moteur du SGBD à chaque insert).
    On peut également choisir un décrément plutôt qu'un incrément
    Je ne sais pas si LO base propose ces mêmes fonctionnalités
    Démarrer avec la valeur zéro ne pose aucun problème, il n'est pas nécessaire de modifier cette valeur.

    Au sujet des contraintes REFERENCE, les ajouter après les CREATE TABLE au moyen d'un ALTER TABLE, pourquoi pas, mais après avoir ajouté des lignes dans les tables c'est risqué : il est possible pour ne pas dire probable que faute de contrainte au moment des ajouts, certaines ont été ajoutées alors qu'elles auraient été écartées en présence des contraintes. Du coup, l'ALTER pour poser la contrainte sera en échec.

    Le bon mode opératoire est de créer les tables avec ses contraintes (dans le CREATE TABLE ou juste après avec un ALTER), de créer les index permettant de vérifier ces contraintes, puis de charger les tables

  20. #40
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    les ajouter après les CREATE TABLE au moyen d'un ALTER TABLE, pourquoi pas, mais après avoir ajouté des lignes dans les tables c'est risqué
    Oui mais il y a encore un arrêt de la procédure et un message d'erreur si on les ajoute après les contraintes.

    Supposons que, dans l'ordre de création des tables (et ensuite, même ordre pour l'insertion des données), il y a T_ADRESSES et T_PERSONNES avec cette contrainte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONSTRAINT FK_ADR_ID_PER_ID FOREIGN KEY (PER_ID) REFERENCES T_PERSONNES (PER_ID)
    Les 2 tables sont en place ainsi que la contrainte.

    Si je lance l'INSERT avec du début à la fin du script les lignes ADRESSES puis PERSONNES, l'outil SQL va buter sur la clé étrangère PER_ID de la table ADRESSES puisqu'il ne trouvera pas dans la table PERSONNES les lignes correspondantes. Pour que ça fonctionne, il faudrait insérer les lignes de PERSONNES en premier. Et évidemment, ce qui est facilement faisable avec 2 tables ne l'est plus avec plusieurs.

    C'est pas faute d'avoir cherché mais je n'ai pas trouvé le moyen de désactiver les contraintes provisoirement dans ce moteur BD. C'est embêtant d'ailleurs puisque si je génère un script avec MySql Workbench, les contraintes sont intégrées à chaque table et il faut les séparer manuellement...

Discussions similaires

  1. [AC-97] Requette pour afficher un record en fonction d'une table de liaisons.
    Par Jazz_ dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 16/08/2010, 13h23
  2. Réponses: 3
    Dernier message: 21/01/2009, 22h47
  3. Meilleur méthode pour gérer une liste des blocks
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 41
    Dernier message: 22/07/2008, 02h06
  4. Meilleure méthode pour vider une JTable
    Par JamesP dans le forum Composants
    Réponses: 9
    Dernier message: 17/08/2007, 11h42
  5. Le meilleur hebergeur pour une table sql ?
    Par CyberTwister dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/12/2006, 04h11

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