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

Modélisation Discussion :

Validation diagramme bdd


Sujet :

Modélisation

  1. #61
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir orygynz,


    Il n’y a pas de complication, sinon qu’on peut effectivement faire l’économie de la colonne id_ligne_facture. Toutefois, la cl primaire de la table LIGNE_FACTURE n’est pas le triplet (id_client, id_projet, id_facture) mais seulement la paire (id_client, id_projet), sinon un projet pourrait être associé à plusieurs factures, ce qui n’est pas pertinent.

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

  2. #62
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ok ça marche, c'est vrai que je trouve ça mieux sans id_ligne_facture, du coup, je propose la nouvelle version. J'ai tenté quelque chose pour l'avoir...

    Nom : IMG-MCDv2-8.png
Affichages : 1971
Taille : 167,5 Ko

    Merci,
    Orygynz

  3. #63
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonjour orygynz,



    Citation Envoyé par orygynz Voir le message
    Alors oui, un projet ne fait référence qu'à une seule tâche mais une tâche peut faire référence à plusieurs projets.
    C'est-à-dire qu’un projet est mono-tâche. Dans votre dernier diagramme, il est encore multi-tâches...

    Correction à apporter :




    Correction analogue concernant les avoirs :




    Bon dimanche !
    (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.

  4. #64
    Invité
    Invité(e)
    Par défaut
    Monsieur, je plaide non coupable !!!

    Tu dois te dire que je fais un truc sur 2, mais la modification sur la tâche, je l'avais fait y'a longtemps !!! Suite à ta correction. J'ai mal dû enregistrer à ce moment là... Je n'ai pas regardé cette partie vu qu'on se concentrait sur ligne_facture...

    Ok pour l'avoir, j'ai corrigé sur le diagramme.

    Du coup, il ne reste plus que la partie Devis, à ton avis, qu'elle est la meilleure solution par rapport à ce que l'ont a dit ?

    Refaire des tables HEURE, FORFAIT, MOT, DEVIS_CHANGE, etc... dédié au devis ?
    Ou alors je pars sur une table combiné HEURE/FORFAIT/MOT et je bidouille un truc que pour les devis... Je le répète, ça arrive 1 fois par an ...

    Merci !

  5. #65
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut canada dry
    Concernant les devis, on ne va pas se prendre la tête avec ça : je pense que, pour la table PROJET, on peut ajouter un attribut TypeProjet prenant soit la valeur 'P' (projet) soit la valeur 'D' (devis, c'est-à-dire que ça a tout d’un projet, mais ça n’est que du canada dry...)
    (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.

  6. #66
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ok, merci pour cette solution, je vais voir comment implémenter cela.

    Ci-joint, le code SQL qui va avec le schéma, j'ai supprimé tous les INDEX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    -- MySQL Script generated by MySQL Workbench
    -- dim. 21 déc. 2014 15:21:54 CET
    -- Model: New Model    Version: 1.0
    -- MySQL Workbench Forward Engineering
    
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
    
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    CREATE SCHEMA IF NOT EXISTS `BDD` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
    USE `BDD` ;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`CLIENT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`CLIENT` (
      `id_client` INT NOT NULL AUTO_INCREMENT,
      `raison_sociale` VARCHAR(50) NOT NULL,
      `adresse` VARCHAR(50) NOT NULL,
      `code_postal` VARCHAR(10) NOT NULL,
      `ville` VARCHAR(50) NOT NULL,
      `pays` VARCHAR(50) NOT NULL,
      `numero_tva` VARCHAR(50) NOT NULL,
      `delai_paiement_def` INT(2) NOT NULL,
      `type_paiement_def` VARCHAR(20) NOT NULL,
      `aff_total_mots_def` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_client`))
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`TACHE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`TACHE` (
      `id_tache` INT NOT NULL AUTO_INCREMENT,
      `tache` VARCHAR(100) NOT NULL,
      `affichage_langue_facture` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_tache`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MOT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MOT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_mot` INT NOT NULL,
      `NbMots` INT(10) NOT NULL,
      `Tarif` INT(10) NOT NULL,
      `MatchValeur` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`, `id_mot`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`HEURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`HEURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `prix_heure` DECIMAL(10,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FORFAIT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FORFAIT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `tarif_forfait` DECIMAL(10,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `id_tache` INT NOT NULL,
      `reference` VARCHAR(150) NOT NULL,
      `description_projet` VARCHAR(255) NOT NULL,
      `langue_source` VARCHAR(30) NOT NULL,
      `date_projet_debut` DATE NOT NULL,
      `date_projet_fin` DATE NOT NULL,
      `nbjours` INT(5) NOT NULL,
      `montant_total_projet` DECIMAL(10,2) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_2`
        FOREIGN KEY (`id_tache`)
        REFERENCES `BDD`.`TACHE` (`id_tache`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_PROJET_3`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`MOT` (`id_client` , `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_PROJET_4`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`HEURE` (`id_client` , `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_PROJET_5`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`FORFAIT` (`id_client` , `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `num_facture` VARCHAR(15) NOT NULL,
      `date_facture` DATE NOT NULL,
      `langue_facture` VARCHAR(20) NOT NULL,
      `total_net` DECIMAL(10,2) NOT NULL,
      `date_paiement` DATE NOT NULL,
      `type_paiement` VARCHAR(20) NOT NULL,
      `delai_paiement` INT(2) NOT NULL,
      `chemin_facture_pdf` VARCHAR(254) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      UNIQUE INDEX `num_facture_UNIQUE` (`num_facture` ASC),
      CONSTRAINT `fk_FACTURE_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PAYPAL`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PAYPAL` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `frais_paypal` DECIMAL(10,2) NOT NULL,
      `chemin_paypal_pdf` VARCHAR(250) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_PAYPAL_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MONNAIE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MONNAIE` (
      `id_monnaie` INT NOT NULL AUTO_INCREMENT,
      `monnaie` VARCHAR(15) NOT NULL,
      PRIMARY KEY (`id_monnaie`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE_CHANGE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `taux_change_facture` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_FACTURE_CHANGE_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_FACTURE_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET_CHANGE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `taux_change_projet` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_CHANGE_1`
        FOREIGN KEY (`id_client`,`id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`,`id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`LIGNE_FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`LIGNE_FACTURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_facture` INT NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_LIGNE_FACTURE_1`
        FOREIGN KEY (`id_client`,`id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`,`id_facture`)
        ON DELETE CASCADE
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_LIGNE_FACTURE_2`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`, `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`AVOIR`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`AVOIR` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `montant_avoir` DECIMAL(10,4) NOT NULL,
      `commentaires_avoir` VARCHAR(150) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_AVOIR_1`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`LIGNE_FACTURE` (`id_client`, `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    Les TRIGGERS mis à jour, pour commencer, celui pour l'auto_increment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    COMMIT ;
    DELIMITER GO
     
    CREATE TRIGGER  PROJET_INCREMENT_TR BEFORE INSERT ON  PROJET 
    FOR EACH ROW
        BEGIN 
            SET NEW.id_projet = (SELECT COALESCE(MAX(id_projet) + 1, 1)  
                                     FROM   PROJET 
                                     WHERE  id_client = NEW.id_client) ;
        END
     
    GO
    DELIMITER ;
    COMMIT ;
    Pour l'exclusion de type de projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    CREATE TRIGGER MOT_EXCLUSION_TR BEFORE INSERT  ON MOT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps un forfait.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   HEURE 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps une heure.' ;
        END IF ;
     
    END ;
    
    CREATE TRIGGER FORFAIT_EXCLUSION_TR BEFORE INSERT  ON FORFAIT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   HEURE 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps une heure.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    
    HEURE
    De mon côté, seul le dernier TRIGGER ne fonctionne pas, toujours cette erreur :

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 9
    Je suis maintenant en version mysql 5.5.40

    On arrive au bout, merci !

  7. #67
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir orygynz,


    Citation Envoyé par orygynz Voir le message
    De mon côté, seul le dernier TRIGGER ne fonctionne pas.
    C’est normal, puisque votre trigger PROJET_INCREMENT_TR est suivi des deux lignes qui n’ont pas encore lieu d’être et qu’il faut supprimer :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELIMITER ;
    COMMIT ;

    Elles ne seront à utiliser qu’après le GO qui clôt le dernier trigger.

    Plus important :

    Les tables MOT, HEURE, FORFAIT sont dépourvues de clés étrangères alors que la table PROJET en a trois de trop ! L’effet Dagobert joue plein pot !
    (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.

  8. #68
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je trouvais ça bizarre pour la table PROJET mais je me suis dis, MySQLworkbench ne peut pas se tromper, le schéma est bon ... Après votre réflexion, je suis retourné voir et la mise à jour du système que j'ai effectué (maj debian) a mis à jour workbench et cela avait supprimé tous les liens vers ces 3 tables ...

    Voici le bon (je l'espère) code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    -- MySQL Script generated by MySQL Workbench
    -- dim. 21 déc. 2014 15:21:54 CET
    -- Model: New Model    Version: 1.0
    -- MySQL Workbench Forward Engineering
    
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
    
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    CREATE SCHEMA IF NOT EXISTS `BDD` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
    USE `BDD` ;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`CLIENT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`CLIENT` (
      `id_client` INT NOT NULL AUTO_INCREMENT,
      `raison_sociale` VARCHAR(50) NOT NULL,
      `adresse` VARCHAR(50) NOT NULL,
      `code_postal` VARCHAR(10) NOT NULL,
      `ville` VARCHAR(50) NOT NULL,
      `pays` VARCHAR(50) NOT NULL,
      `numero_tva` VARCHAR(50) NOT NULL,
      `delai_paiement_def` INT(2) NOT NULL,
      `type_paiement_def` VARCHAR(20) NOT NULL,
      `aff_total_mots_def` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_client`))
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`TACHE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`TACHE` (
      `id_tache` INT NOT NULL AUTO_INCREMENT,
      `tache` VARCHAR(100) NOT NULL,
      `affichage_langue_facture` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_tache`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MOT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MOT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_mot` INT NOT NULL,
      `NbMots` INT(10) NOT NULL,
      `Tarif` INT(10) NOT NULL,
      `MatchValeur` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`, `id_mot`),
      CONSTRAINT `fk_MOT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`HEURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`HEURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `prix_heure` DECIMAL(10,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_HEURE_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FORFAIT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FORFAIT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `tarif_forfait` DECIMAL(10,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_FORFAIT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `id_tache` INT NOT NULL,
      `reference` VARCHAR(150) NOT NULL,
      `description_projet` VARCHAR(255) NOT NULL,
      `langue_source` VARCHAR(30) NOT NULL,
      `date_projet_debut` DATE NOT NULL,
      `date_projet_fin` DATE NOT NULL,
      `nbjours` INT(5) NOT NULL,
      `montant_total_projet` DECIMAL(10,2) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_2`
        FOREIGN KEY (`id_tache`)
        REFERENCES `BDD`.`TACHE` (`id_tache`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `num_facture` VARCHAR(15) NOT NULL,
      `date_facture` DATE NOT NULL,
      `langue_facture` VARCHAR(20) NOT NULL,
      `total_net` DECIMAL(10,2) NOT NULL,
      `date_paiement` DATE NOT NULL,
      `type_paiement` VARCHAR(20) NOT NULL,
      `delai_paiement` INT(2) NOT NULL,
      `chemin_facture_pdf` VARCHAR(254) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      UNIQUE INDEX `num_facture_UNIQUE` (`num_facture` ASC),
      CONSTRAINT `fk_FACTURE_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PAYPAL`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PAYPAL` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `frais_paypal` DECIMAL(10,2) NOT NULL,
      `chemin_paypal_pdf` VARCHAR(250) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_PAYPAL_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MONNAIE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MONNAIE` (
      `id_monnaie` INT NOT NULL AUTO_INCREMENT,
      `monnaie` VARCHAR(15) NOT NULL,
      PRIMARY KEY (`id_monnaie`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE_CHANGE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `taux_change_facture` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_FACTURE_CHANGE_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_FACTURE_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET_CHANGE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `taux_change_projet` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_CHANGE_1`
        FOREIGN KEY (`id_client`,`id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`,`id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`LIGNE_FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`LIGNE_FACTURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_facture` INT NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_LIGNE_FACTURE_1`
        FOREIGN KEY (`id_client`,`id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`,`id_facture`)
        ON DELETE CASCADE
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_LIGNE_FACTURE_2`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`, `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`AVOIR`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`AVOIR` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `montant_avoir` DECIMAL(10,4) NOT NULL,
      `commentaires_avoir` VARCHAR(150) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_AVOIR_1`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`LIGNE_FACTURE` (`id_client`, `id_projet`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    Pour les TRIGGERS, on s'est mal compris, le TRIGGER pour l'auto_increment fonctionne. C'est le 2ème qui a toujours la même erreur, celui qui empêche d'avoir un même projet dans les tables FORFAIT, HEURE & MOT.

    Merci !
    Orygynz

  9. #69
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Personnellement, ce qui me gêne le plus dans tout cet exposé est la modélisation orientée BDD.
    En ne faisant pas de modèle "conceptuel", il manque, j'en suis sûr, des concepts métier importants

    Bon j'ai pas fait avancé ton application mais pour expliquer les choses à tes clients et à nous, il eu été plus facile de partir d'un modèle conceptuel......en UML par exemple

  10. #70
    Invité
    Invité(e)
    Par défaut
    Je te rassure, un seul client ! Cette application restera pour le traducteur ... Le but est d'avoir un truc dédié à la personne et à sa clientèle.
    Au début, je me posais la question de savoir ce que je pourrais faire de cet outil mais au mieux, je le laisserais à dispo en libre.

    Après, je me sers de l'expérience de la V1 Mais sûrement qu'il fallait démarrer à partir d'un modèle conceptuel.

  11. #71
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir orygynz,



    Citation Envoyé par orygynz Voir le message
    Après votre réflexion, je suis retourné voir et la mise à jour du système que j'ai effectué (maj Debian) a mis à jour Workbench et cela avait supprimé tous les liens vers ces 3 tables ...
    Je ne connais pas Debian, mais si c’est lui qui a généré votre dernier script, sachez que l’effet Dagobert joue encore à fond. En effet, la table PROJET y est définie après les table MOT, FORFAIT et HEURE : il faut remettre les CREATE dans le bon ordre...



    Citation Envoyé par orygynz Voir le message
    Pour les TRIGGERS, on s'est mal compris, le TRIGGER pour l'auto_increment fonctionne. C'est le 2ème qui a toujours la même erreur.
    J’ai parfaitement compris ce qui s’est passé, et où est votre erreur, qui n’est qu’une erreur de syntaxe en relation avec les délimiteurs d’instructions « GO » et « ; ».

    Dans le script ci-dessous, issu de MySQL Workbench (et nettoyé de ses grouilles), j’ai ajouté les instructions CREATE TRIGGER, mais en faisant attention aux délimiteurs d’instructions, comme le recommande MySQL !

    Ce script ne comporte pas toutes les tables, seulement celles sur lesquelles il y a des remarques à faire (idem pour les triggers) . Il fonctionne parfaitement. Repérez les délimiteurs « GO » et « ; » !

    Ce script tourne comme une horloge ! Testez-le.

    CREATE TABLE TACHE 
    (
         id_tache INT NOT NULL
       , TacheNom VARCHAR(32) NOT NULL
      , PRIMARY KEY (id_tache)
    )  ;
    
    CREATE TABLE  CLIENT 
    (
      id_client INT NOT NULL,
      Clientnom VARCHAR(32) NOT NULL,
      PRIMARY KEY (id_client)
    )  ;
    
    CREATE TABLE PROJET 
    (
        id_client INT NOT NULL
      , id_projet INT NOT NULL
      , id_tache INT NOT NULL
      , Reference VARCHAR(64) NOT NULL
      , LangueSource VARCHAR(64) NOT NULL
      , PRIMARY KEY (id_client, id_projet)
      , CONSTRAINT LIGNE_PROJET_TACHE_FK1 FOREIGN KEY (id_tache) REFERENCES TACHE (id_tache)
      , CONSTRAINT PROJET_CLIENT_FK2 FOREIGN KEY (id_client) REFERENCES CLIENT (id_client)
    )  ;
    
    CREATE TABLE FACTURE 
    (
        id_client INT NOT NULL
      , id_facture INT NOT NULL
      , num_facture INT NOT NULL
      , date_facture DATE NOT NULL
      , PRIMARY KEY (id_client, id_facture)
      , CONSTRAINT FACTURE_AK UNIQUE (num_facture)
      , CONSTRAINT FACTURE_CLIENT_FK FOREIGN KEY (id_client)
        REFERENCES CLIENT (id_client)
    )  ;
    
    CREATE TABLE LIGNE_FACTURE 
    (
        id_client INT NOT NULL
      , id_projet INT NOT NULL
      , id_facture INT NOT NULL
      , PRIMARY KEY (id_client, id_projet)
      , CONSTRAINT LIGNE_FACTURE_FACTURE_FK1 FOREIGN KEY (id_client, id_facture)
        REFERENCES FACTURE (id_client, id_facture) ON DELETE CASCADE
     ,  CONSTRAINT LIGNE_FACTURE_PROJET_FK1 FOREIGN KEY (id_client, id_projet)
        REFERENCES PROJET (id_client, id_projet)
    )  ;
    
    CREATE TABLE HEURE 
    (
        id_client INT NOT NULL
      , id_projet INT NOT NULL
      , TatifHoraire INT NOT NULL
      , PRIMARY KEY (id_client, id_projet)
      , CONSTRAINT HEURE_LIGNE_PROJET_FK1 FOREIGN KEY (id_client, id_projet)
        REFERENCES PROJET (id_client , id_projet) ON DELETE CASCADE
    )  ;
    
    CREATE TABLE MOT 
    (
        id_client INT NOT NULL
      , id_projet INT NOT NULL
      , id_mot INT NOT NULL
      , NbMots INT NOT NULL
      , Tarif INT NOT NULL
      , MatchValeur VARCHAR(64) NOT NULL
      , PRIMARY KEY (id_client, id_projet, id_mot)
      , CONSTRAINT MOT_LIGNE_PROJET_FK1 FOREIGN KEY (id_client, id_projet)
        REFERENCES PROJET (id_client, id_projet)
        ON DELETE CASCADE
    )  ;
    
    CREATE TABLE FORFAIT 
    (
        id_client INT NOT NULL
      , id_projet INT NOT NULL
      , tarif_forfait INT NOT NULL
      , PRIMARY KEY (id_client, id_projet)
      , CONSTRAINT FORFAIT_LIGNE_PROJET_FK1 FOREIGN KEY (id_client, id_projet)
        REFERENCES PROJET (id_client, id_projet) ON DELETE CASCADE
    )  ;
    -- -------------------------------------------------------------------------------------------
    -- Le délimiteur entre instructions CREATE n’est plus le « ; » mais « GO » :
    -- -------------------------------------------------------------------------------------------
    COMMIT ;
    DELIMITER GO
    
    CREATE TRIGGER  PROJET_INCREMENT_TR BEFORE INSERT ON  PROJET 
    FOR EACH ROW
        BEGIN 
            SET NEW.id_projet = (SELECT COALESCE(MAX(id_projet) + 1, 1)  
                                     FROM   PROJET 
                                     WHERE  id_client = NEW.id_client) ;
        END
     
    GO
    
    CREATE TRIGGER MOT_EXCLUSION_TR BEFORE INSERT  ON MOT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps un forfait.' ;
        END IF ;
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   HEURE 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps une heure.' ;
        END IF ;
        
       -- partie identification relative 
         
            SET NEW.id_mot = (SELECT COALESCE(MAX(id_mot) + 1, 1)  
                             FROM   MOT 
                             WHERE  id_client = NEW.id_client AND id_projet = NEW.id_projet) ;
    END ;
    
    GO
    
    CREATE TRIGGER FORFAIT_EXCLUSION_TR BEFORE INSERT  ON FORFAIT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   HEURE 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps une heure.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    
    GO
    -- ------------------------------------------------------------------------------------------
    -- Le délimiteur « ; «  retrouve son rôle normal
    -- ------------------------------------------------------------------------------------------
    DELIMITER ;
    COMMIT ;
    
    INSERT INTO CLIENT (id_client, Clientnom) VALUES (1, 'Ets Naudin') ;
    INSERT INTO CLIENT (id_client, Clientnom) VALUES (2, 'Volfoni SA') ;
    INSERT INTO CLIENT (id_client, Clientnom) VALUES (3, 'Dubicobit') ;
    
    SELECT *, '' AS '<= CLIENT' FROM CLIENT ;
    
    INSERT INTO TACHE (id_tache, TacheNom) VALUES (1, 'tâche 1') ;
    INSERT INTO TACHE (id_tache, TacheNom) VALUES (2, 'tâche 2') ;
    INSERT INTO TACHE (id_tache, TacheNom) VALUES (3, 'tâche 3') ;
    INSERT INTO TACHE (id_tache, TacheNom) VALUES (4, 'tâche 4') ;
    
    SELECT *, '' AS '<= TACHE' FROM TACHE ;
    
    INSERT INTO PROJET (id_client, id_projet, id_tache, Reference, LangueSource) VALUES (1, 1, 1, 'réf 1 Naudin', 'provençal') ;
    INSERT INTO PROJET (id_client, id_projet, id_tache, Reference, LangueSource) VALUES (1, 2, 1, 'réf 2 Naudin', 'chitimi') ;
    INSERT INTO PROJET (id_client, id_projet, id_tache, Reference, LangueSource) VALUES (1, 3, 1, 'réf 2 Naudin', 'gallois') ;
    
    INSERT INTO PROJET (id_client, id_projet, id_tache, Reference, LangueSource) VALUES (2, 1, 1,  'réf 1 de Volfoni', 'javanais') ;
    INSERT INTO PROJET (id_client, id_projet, id_tache, Reference, LangueSource) VALUES (2, 2, 1,  'réf 2 de Volfoni', 'quebecois') ;
    INSERT INTO PROJET (id_client, id_projet, id_tache, Reference, LangueSource) VALUES (2, 3, 1,  'réf 3 de Volfoni', 'breton') ;
    
    INSERT INTO PROJET (id_client, id_projet, id_tache, Reference, LangueSource) VALUES (3, 1, 2, 'réf 1 de Dubicobit', 'basque') ;
    
    SELECT *, '' AS '<= PROJET' FROM PROJET ;
    -- --------------------------------------------------------------------------------------
    
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (1, 1, 123456789, '2015_01_26') ;
    
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (1, 2, 145320147, '2015_01_26') ;
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (1, 3, 158500036, '2015_01_27') ;
    
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (2, 1, 247820143, '2015_01_26') ;
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (2, 2, 257896022, '2015_01_27') ;
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (2, 3, 281478943, '2015_01_28') ;
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (2, 4, 291475478, '2015_01_29') ;
    
    INSERT INTO FACTURE (id_client, id_facture, num_facture, date_facture) VALUES (3, 1, 347820143, '2015_01_19') ;
    
    SELECT *, '' AS '<= FACTURE' FROM FACTURE ;
    
    
    INSERT INTO FORFAIT (id_client, id_projet, tarif_forfait) VALUES (1, 1,10000) ;
    
    SELECT *, '' AS '<= FORFAIT' FROM FORFAIT ;
    
    
    INSERT INTO  MOT (id_client, id_projet, id_mot, NbMots, Tarif, MatchValeur) VALUES (1, 1, 0, 50, 100, 'doublonne avec FORFAIT !') ;
    
    INSERT INTO  MOT (id_client, id_projet, id_mot, NbMots, Tarif, MatchValeur) VALUES (1, 2, 0, 50, 100, 'Bonjour Madame') ;
    INSERT INTO  MOT (id_client, id_projet, id_mot, NbMots, Tarif, MatchValeur) VALUES (1, 2, 0, 50, 200, 'Bonsoir Monsieur') ;
    
    INSERT INTO  MOT (id_client, id_projet, id_mot, NbMots, Tarif, MatchValeur) VALUES (2, 1, 0, 10, 300, 'Sorry') ;
    INSERT INTO  MOT (id_client, id_projet, id_mot, NbMots, Tarif, MatchValeur) VALUES (2, 1,  0, 10, 400, 'Query') ;
    INSERT INTO  MOT (id_client, id_projet, id_mot, NbMots, Tarif, MatchValeur) VALUES (2, 1, 0, 10, 500, 'Language') ;
    
    SELECT *, '' AS '<= MOT' FROM MOT ORDER BY 1, 2, 3 ;
    -- -------------------------------------------------------------------------------------------
    
    INSERT INTO FORFAIT (id_client, id_projet, tarif_forfait) VALUES (1, 2,10000) ;
    
    SELECT *, '' AS '<= FORFAIT' FROM FORFAIT ; 

    Ensuite, relisez bien votre code, l'ordre des CREATE TABLE et des délimiteurs de CREATE...
    (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. #72
    Invité
    Invité(e)
    Par défaut
    Ah non mais là, je suis pas d'accord !!!!

    Tu vas dire, bon c'est bon orygynz, je commence à le connaître, il m'a encore trouvé une excuse ...
    MAIS là, c'est clairement phpmyadmin qui me fout dedans !!!! Dans les anciennes versions, si les tables n'étaient pas dans l'ordre, BIM, gros message d'erreur pour dire "No no, la contrainte ne peut pas être appliqué...". Et là, il accepte le code sans broncher !!! Et je me souviens bien de la 1ère fois, je me suis ah bah niquel, la nouvelle version de phpmyadmin (ou mysql?) analyse le code (temporaire?) pour tout remettre dans l'ordre... Super gain de temps ... Mais NON !

    Là, j'ai remis mon code et je vais voir, les contraintes ne sont pas appliqués et sans message d'erreur, SUPER !

    Alors sinon, j'ai testé ton code et ça ne fonctionne pas ! Je plaisante, je tombe sur le message d'erreur logique pour le forfait !

    Du coup, je vais remettre demain un code SQL dans le bonne ordre !

    Merci beaucoup pour cette explication.

    En ce qui concerne Debian, c'est une distribution Linux, j'ai mis à jour mon système d'exploitation et MySQLworkbench a suivi... C'est lui qui m'a édité le code avec des index que j'ai dû virer... Des contraintes pas du tout dans le bonne ordre (erreur que vous aviez trouvé...). Enfin bon, je dois pas le maîtriser suffisamment...

    Merci !
    Orygynz

  13. #73
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par orygynz Voir le message
    Tu vas dire, bon c'est bon orygynz, je commence à le connaître, il m'a encore trouvé une excuse ...
    Meuh non ! Je me doute bien qu’il y a des outils qui ne cherchent qu’à ficher la patouille... En temps que bon grand-père considérant qu’il n’y a pas le feu a lac, je cherche à vous aider, avec patience. Si on fonçait, on se planterait dans les grandes largeurs et ça n’est pas le but recherché : keep cool ! Mais restez vigilant en ce qui concerne ce que vous génèrent ces outils qui devraient au moins être dotés d’un petit système expert pour générer les CREATE TABLE dans le bon ordre.



    Citation Envoyé par orygynz Voir le message
    MAIS là, c'est clairement phpmyadmin qui me fout dedans !!!!
    Encore un que je connais pas...



    Citation Envoyé par orygynz Voir le message
    Alors sinon, j'ai testé ton code et ça ne fonctionne pas ! Je plaisante, je tombe sur le message d'erreur logique pour le forfait !
    C’est pas beau ça ?



    Citation Envoyé par orygynz Voir le message
    C'est lui qui m'a édité le code avec des index que j'ai dû virer...
    De fait, comme déjà évoqué, le mieux est de virer les index au départ, et ce n’est que l’on expertise les requêtes « sensibles », lorsqu’on fait du prototypage de performances qu’on en ajoute, parcimonieusement, quand ça produit l’effet turbo qu’on en attend, sans dégrader les mises à jour. Relisez ce que j’ai signalé à propos de l’instruction EXPLAIN : EXPLAIN est votre ami.
    (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. #74
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut From grave to cradle...
    Citation Envoyé par ego Voir le message
    Personnellement, ce qui me gêne le plus dans tout cet exposé est la modélisation orientée BDD.
    Il ne s’agit pas d’un exposé, mais d’un (long) échange, nuance. Je ne sais pas ce que vous entendez par « modélisation orientée BDD », mais si l’on reprend le coeur du diagramme utilisé au fil de la discussion, je pense qu’il n’a rien d’abscons :




    Si c’est la notation patte d’oie (crow’s foot) des associations qui vous perturbe, on peut demander à MySQL Workbench d’en passer par la notation UML :




    Où vous observerez que les traditionnels losanges symbolisant les relations de composition sont ici remplacés par des clés de couleur rouge certes pisseux, mais au moins on comprend de quoi il s’agit.

    Si vous ne trouvez pas le diagramme à votre goût, on peut essayer autre chose, en passant par une rétro-conception à partir du code SQL généré par MySQL Workbench. On demande par exemple à PowerAMC de s’y employer, lequel produit le MLD suivant :




    On lui demande d’effectuer la rétro-conception du MLD en digramme de classes :



    PowerAMC a bien défini les relations de composition, mais il a oublié d’afficher les losanges, on lui demande donc de le faire. Il s’est planté en remplaçant les multiplicités 0..1 par 0..*, on corrige manuellement. On remplace aussi les multiplicités 0..* par 1..* quand il le faut, mais en l’occurrence PowerAMC n’y est pour rien, le code SQL source étant muet à ce sujet. On supprime l’attribut ClientId de la classe LIGNE_FACTURE, car on mis l’AGL dans l’embarras : présence d’une contrainte de chemin obligeant à atteindre le même projet, que l’on navigue de CLIENT à PROJET soit directement soit via FACTURE et LIGNE_FACTURE.



    Vous noterez que ce diagramme ne prend pas en compte la contrainte de chemin évoquée. Il est vrai que lorsqu’il y a de la représentation graphique « conceptuelle », la sémantique et l’œil y trouvent leur compte, mieux qu’avec MySQL Workbench et son côté « BDD » mais quand il s’agit de prendre en compte l’intégrité des données, avantage à l'occasion à MySQL Workbench (notons que WinDesign permet quand même de prendre en compte la contrainte de chemin dans le MCD merisien, au moyen d'une contrainte d'inclusion). Si l'on génère le code SQL à partir du diagramme de classes, il est évident qu'il faudrait retoucher la structure de la table LIGNE_FACTURE, à moins qu'ULM de permette de s'en sortir au stade du diagramme de classes, mais a priori je ne vois pas comment. Si vous avez une solution, je suis preneur...


    En annexe : code SQL généré par MySQL Workbench et repris pour la rétro-conception selon PowerAMC :

    CREATE TABLE TACHE (
      TacheId INT NOT NULL,
      TacheNom VARCHAR(32) NOT NULL,
      PRIMARY KEY (TacheId)) ;
    
    CREATE TABLE CLIENT (
      ClientId INT NOT NULL,
      ClientNom VARCHAR(32) NOT NULL,
      PRIMARY KEY (ClientId)) ;
    
    CREATE TABLE PROJET (
      ClientId INT NOT NULL,
      ProjetId INT NOT NULL,
      TacheId INT NOT NULL,
      Reference VARCHAR(64) NOT NULL,
      LangueSource VARCHAR(64) NOT NULL,
      PRIMARY KEY (ClientId, ProjetId),
      CONSTRAINT LIGNE_PROJET_TACHE_FK FOREIGN KEY (TacheId) REFERENCES TACHE (TacheId)
        ON DELETE NO ACTION ON UPDATE NO ACTION,
      CONSTRAINT PROJET_CLIENT_FK FOREIGN KEY (ClientId) REFERENCES CLIENT (ClientId)
        ON DELETE NO ACTION ON UPDATE NO ACTION) ;
    
    CREATE TABLE FACTURE (
      ClientId INT NOT NULL,
      FactureId INT NOT NULL,
      FactureNumero INT NOT NULL,
      FactureDate DATE NOT NULL,
      PRIMARY KEY (ClientId, FactureId),
      CONSTRAINT FACTURE_AK UNIQUE (FactureNumero),
      CONSTRAINT FACTURE_CLIENT_FK FOREIGN KEY (ClientId) REFERENCES CLIENT (ClientId)
        ON DELETE NO ACTION ON UPDATE NO ACTION) ;
    
    CREATE TABLE LIGNE_FACTURE (
      ClientId INT NOT NULL,
      ProjetId INT NOT NULL,
      FactureId INT NOT NULL,
      PRIMARY KEY (ClientId, ProjetId),
      CONSTRAINT LIGNE_FACTURE_FACTURE_FK FOREIGN KEY (ClientId, FactureId) REFERENCES FACTURE (ClientId, FactureId)
        ON DELETE CASCADE ON UPDATE NO ACTION,
      CONSTRAINT LIGNE_FACTURE_PROJET_FK FOREIGN KEY (ClientId, ProjetId) REFERENCES PROJET (ClientId, ProjetId)
        ON DELETE NO ACTION ON UPDATE NO ACTION) ;
    
    CREATE TABLE HEURE (
      ClientId INT NOT NULL,
      ProjetId INT NOT NULL,
      TatifHoraire INT NOT NULL,
      PRIMARY KEY (ClientId, ProjetId),
      CONSTRAINT HEURE_LIGNE_PROJET_FK FOREIGN KEY (ClientId, ProjetId) REFERENCES PROJET (ClientId, ProjetId)
        ON DELETE CASCADE ON UPDATE NO ACTION) ;
    
    CREATE TABLE MOT (
      ClientId INT NOT NULL,
      ProjetId INT NOT NULL,
      MotId INT NOT NULL,
      NbMots INT NOT NULL,
      Tarif INT NOT NULL,
      MatchValeur VARCHAR(64) NOT NULL,
      PRIMARY KEY (ClientId, ProjetId, MotId),
      CONSTRAINT MOT_LIGNE_PROJET_FK FOREIGN KEY (ClientId, ProjetId) REFERENCES PROJET (ClientId, ProjetId)
        ON DELETE CASCADE ON UPDATE NO ACTION) ;
    
     CREATE TABLE FORFAIT (
      ClientId INT NOT NULL,
      ProjetId INT NOT NULL,
      ForfaitMontant INT NOT NULL,
      PRIMARY KEY (ClientId, ProjetId),
      CONSTRAINT FORFAIT_LIGNE_PROJET_FK FOREIGN KEY (ClientId, ProjetId) REFERENCES PROJET (ClientId, ProjetId)
        ON DELETE CASCADE ON UPDATE NO ACTION) ;
    
    CREATE TABLE AVOIR (
      ClientId INT NOT NULL,
      ProjetId INT NOT NULL,
      PRIMARY KEY (ClientId, ProjetId),
      CONSTRAINT AVOIR_LIGNE_FACTURE_FK FOREIGN KEY (ClientId, ProjetId) REFERENCES LIGNE_FACTURE (ClientId, ProjetId)
        ON DELETE CASCADE ON UPDATE NO ACTION) ;
    
    (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. #75
    Invité
    Invité(e)
    Par défaut
    Il manque une version ?

    Alors, phpmyadmin, c'est un outil à utiliser sur un navigateur qui permet de gérer sa base MySQL en interface graphique, gain de temps énorme !

    Mais pour le coup, le code du haut ne fonctionnait pas à cause des DELIMITER, j'ai testé un code fonctionnel mais phpmyadmin ne m'affiche pas les contraintes de clés pour MOT, FORFAIT et HEURE ! Alors que les contraintes des autres tables sont bien affichés ... Je m'en suis rendu compte en exportant la table en SQL et là BIM, j'avais bien les contraintes de clés ...
    Dommage, vous ne connaissez pas phpmyadmin, vous auriez sûrement pu me dire pourquoi ! :-D

    Ci-joint, le code qui fonctionne de mon côté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    -- MySQL Script generated by MySQL Workbench
    -- dim. 21 déc. 2014 15:21:54 CET
    -- Model: New Model    Version: 1.0
    -- MySQL Workbench Forward Engineering
    
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
    
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    CREATE SCHEMA IF NOT EXISTS `BDD` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
    USE `BDD` ;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`CLIENT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`CLIENT` (
      `id_client` INT NOT NULL AUTO_INCREMENT,
      `raison_sociale` VARCHAR(50) NOT NULL,
      `adresse` VARCHAR(50) NOT NULL,
      `code_postal` VARCHAR(10) NOT NULL,
      `ville` VARCHAR(50) NOT NULL,
      `pays` VARCHAR(50) NOT NULL,
      `numero_tva` VARCHAR(50) NOT NULL,
      `delai_paiement_def` INT(2) NOT NULL,
      `type_paiement_def` VARCHAR(20) NOT NULL,
      `aff_total_mots_def` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_client`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `num_facture` VARCHAR(15) NOT NULL,
      `date_facture` DATE NOT NULL,
      `langue_facture` VARCHAR(20) NOT NULL,
      `total_net` DECIMAL(10,2) NOT NULL,
      `date_paiement` DATE NOT NULL,
      `type_paiement` VARCHAR(20) NOT NULL,
      `delai_paiement` INT(2) NOT NULL,
      `chemin_facture_pdf` VARCHAR(254) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      UNIQUE INDEX `num_facture_UNIQUE` (`num_facture` ASC),
      CONSTRAINT `fk_FACTURE_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`TACHE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`TACHE` (
      `id_tache` INT NOT NULL AUTO_INCREMENT,
      `tache` VARCHAR(100) NOT NULL,
      `affichage_langue_facture` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_tache`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `id_tache` INT NOT NULL,
      `reference` VARCHAR(150) NOT NULL,
      `description_projet` VARCHAR(255) NOT NULL,
      `langue_source` VARCHAR(30) NOT NULL,
      `date_projet_debut` DATE NOT NULL,
      `date_projet_fin` DATE NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_2`
        FOREIGN KEY (`id_tache`)
        REFERENCES `BDD`.`TACHE` (`id_tache`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MOT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MOT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_mot` INT NOT NULL,
      `nbmots` INT(10) NOT NULL,
      `tarif_mot` INT(10) NOT NULL,
      `match` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`, `id_mot`),
      CONSTRAINT `fk_MOT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`HEURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`HEURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `nbheure` INT NOT NULL,
      `tarif_heure` DECIMAL(10,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_HEURE_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FORFAIT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FORFAIT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `tarif_forfait` DECIMAL(10,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_FORFAIT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PAYPAL`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PAYPAL` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `frais_paypal` DECIMAL(10,2) NOT NULL,
      `chemin_paypal_pdf` VARCHAR(250) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_PAYPAL_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MONNAIE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MONNAIE` (
      `id_monnaie` INT NOT NULL AUTO_INCREMENT,
      `monnaie` VARCHAR(15) NOT NULL,
      PRIMARY KEY (`id_monnaie`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE_CHANGE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `total_net_change` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_FACTURE_CHANGE_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_FACTURE_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET_CHANGE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `taux_change_projet` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_CHANGE_1`
        FOREIGN KEY (`id_client`,`id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`,`id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`LIGNE_FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`LIGNE_FACTURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_facture` INT NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_LIGNE_FACTURE_1`
        FOREIGN KEY (`id_client`,`id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`,`id_facture`)
        ON DELETE CASCADE
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_LIGNE_FACTURE_2`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`, `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`AVOIR`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`AVOIR` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `montant_avoir` DECIMAL(10,4) NOT NULL,
      `commentaires_avoir` VARCHAR(150) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_AVOIR_1`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`LIGNE_FACTURE` (`id_client`, `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    
    -- -------------------------------------------------------------------------------------------
    -- Le délimiteur entre instructions CREATE n’est plus le « ; » mais « GO » :
    -- -------------------------------------------------------------------------------------------
    COMMIT ;
    DELIMITER GO
    
    CREATE TRIGGER  PROJET_INCREMENT_TR BEFORE INSERT ON  PROJET 
    FOR EACH ROW
        BEGIN 
            SET NEW.id_projet = (SELECT COALESCE(MAX(id_projet) + 1, 1)  
                                     FROM   PROJET 
                                     WHERE  id_client = NEW.id_client) ;
        END
     
    GO
    
    CREATE TRIGGER MOT_EXCLUSION_TR BEFORE INSERT  ON MOT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps un forfait.' ;
        END IF ;
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   HEURE 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps une heure.' ;
        END IF ;
        
       -- partie identification relative 
         
            SET NEW.id_mot = (SELECT COALESCE(MAX(id_mot) + 1, 1)  
                             FROM   MOT 
                             WHERE  id_client = NEW.id_client AND id_projet = NEW.id_projet) ;
    END ;
    
    GO
    
    CREATE TRIGGER FORFAIT_EXCLUSION_TR BEFORE INSERT  ON FORFAIT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   HEURE 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps une heure.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    
    GO
    
    CREATE TRIGGER HEURE_EXCLUSION_TR BEFORE INSERT  ON HEURE
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Une heure ne peut pas être en même temps un forfait.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Une heure ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    Tout vous semble ok ?

    Je viens de relire le passage sur EXPLAIN, une PRIMARY KEY est de fait un index ? Cela ne doit pas être écrit dans le code SQL ?
    Je demande cela car EXPLAIN dit bien pour le triggers "Using index" et "PRIMARY". De mémoire, MySQLworkbench fournit un index pour les clés primaires écrit dans le code (je n'ai pas workbench sur moi pour tester)

    Merci,
    Orygynz !

  16. #76
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    Bonsoir orygynz,


    Citation Envoyé par orygynz Voir le message
    Tout vous semble ok ?
    Ça prend une bonne tournure !



    A propos des instructions suivantes (voyez la doc de MySQL Workbench) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    Ces instructions permettent de laisser passer les erreurs... Pour ma part je les supprime.



    Refaites une passe sur le typage de vos attributs.

    Par exemple, pour le code postal, un VARCHAR(10) ne conviendrait que si vous y injectiez le code-pays comme le recommande l’union européenne (norme ISO 3166-1), sinon remplacez par VARCHAR(6) (en tenant compte des départements d’outre-mer).

    L’attribut Pays (VARCHAR(50) !) pourrait être promu en table, avec un code et un libellé, le code étant référencé par les différents attributs qui pourraient se servir du pays (même principe pour la langue).

    Un numéro TVA en VARCHAR(50), ça fait riche, mais quand même ... (13 chiffres suffisent en principe)

    Etc.



    A propos du métabolisme des données

    Si on supprime un projet, les lignes concernées dans les tables MOT, HEURE et FORFAIT n’ont aucune raison d’émettre un veto, ce qui veut dire que « ON DELETE NO ACTION » doit y être remplacé par « ON DELETE CASCADE ».

    Table PAYPAL : même chose.

    Table FACTURE_CHANGE : même chose quant à la suppression d’une facture.

    Table PROJET_CHANGE : même chose quant à la suppression d’un projet.

    Table LIGNE_FACTURE: même chose quant à la suppression d’une facture.



    Citation Envoyé par orygynz Voir le message
    Je viens de relire le passage sur EXPLAIN, une PRIMARY KEY est de fait un index ? Cela ne doit pas être écrit dans le code SQL ?
    La clé primaire est un concept relationnel (inventé en 1970 pat E. F. Codd). Codd faisait dans la logique du 1er ordre et certainement pas dans la quincaillerie. Maintenant, si on descend au ras des pâquerettes, au niveau du SGBD, ce dernier met en œuvre de lui-même un index de type UNIQUE, qu’il associe sous le capot à la clé primaire, pour garantir l’unicité des clés : MySQL Workbench appelle primaire cet index, et c’est tout. De votre côté, vous déclarez la clé primaire, mais pas l’index, puisque MySQL Workbench s’en charge, sans que ça ait à figurer dans un CREATE TABLE ou un CREATE INDEX quelconque (si vous le faisiez, ça ferait deux index dont un clone parfaitement redondant, inutile et encombrant).


    Et bon Noël !
    (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. #77
    Invité
    Invité(e)
    Par défaut
    Ok pour les INDEX, je préfère dans ce sens là !

    Pour les RESTRICT, CASCADE ... Je déteste les trucs automatiques ! Voilà pourquoi je mets toujours RESTRICT ... Sur le code PHP, je recherche toujours avant sur les tables avec des contraintes pour lancer une suppression, et ensuite je supprime le projet ...
    Après, c'est peut-être un côté rassurant mais le CASCADE s'impose ...

    Effectivement, je vais supprimer les lignes que MySQLworkbench ajoute ... Aucun intérêt !

    Je vais vérifier pour le typage des attributs, j'ai de toute façon besoin d'ajouter des champs...
    Par contre, pour le code postal, j'ai mis 10 car par exemple, pour les USA, c'est 8. Du coup, j'ai prévue 2 de plus au cas où ... Pour ne pas faire planter les scripts.

    Bonne idée pour le Pays et la langue, je proposerais cela après Noël !

    Merci pour votre aide et Joyeux Noël !

  18. #78
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Petit message entre les 2 étapes du marathon de fin d'année

    Le nouveau code SQL avec la nouvelle table MONNAIE et PAYS et les CASCADE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    CREATE SCHEMA IF NOT EXISTS `BDD` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
    USE `BDD` ;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PAYS`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PAYS` (
      `id_pays` INT NOT NULL AUTO_INCREMENT,
      `pays` VARCHAR(30) NOT NULL,
      PRIMARY KEY (`id_pays`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`CLIENT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`CLIENT` (
      `id_client` INT NOT NULL AUTO_INCREMENT,
      `id_pays` INT NOT NULL,
      `raison_sociale` VARCHAR(50) NOT NULL,
      `adresse` VARCHAR(50) NOT NULL,
      `code_postal` VARCHAR(10) NOT NULL,
      `ville` VARCHAR(30) NOT NULL,
      `numero_tva` VARCHAR(20) NOT NULL,
      `delai_paiement_def` INT(2) NOT NULL,
      `type_paiement_def` VARCHAR(20) NOT NULL,
      `aff_total_mots_def` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_client`),
      CONSTRAINT `fk_CLIENT_1`
        FOREIGN KEY (`id_pays`)
        REFERENCES `BDD`.`PAYS` (`id_pays`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `num_facture` VARCHAR(15) NOT NULL,
      `date_facture` DATE NOT NULL,
      `total_net` DECIMAL(10,2) NOT NULL,
      `date_paiement` DATE NOT NULL,
      `type_paiement` VARCHAR(20) NOT NULL,
      `delai_paiement` INT(2) NOT NULL,
      `chemin_facture_pdf` VARCHAR(254) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      UNIQUE INDEX `num_facture_UNIQUE` (`num_facture` ASC),
      CONSTRAINT `fk_FACTURE_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`TACHE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`TACHE` (
      `id_tache` INT NOT NULL AUTO_INCREMENT,
      `tache` VARCHAR(50) NOT NULL,
      `affichage_langue_facture` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_tache`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`LANGUE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`LANGUE` (
      `id_langue` INT NOT NULL AUTO_INCREMENT,
      `langue` VARCHAR(30) NOT NULL,
      PRIMARY KEY (`id_langue`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_langue` INT NOT NULL,
      `id_tache` INT NOT NULL,
      `reference` VARCHAR(150) NOT NULL,
      `description_projet` VARCHAR(255) NOT NULL,
      `date_projet_debut` DATE NOT NULL,
      `date_projet_fin` DATE NOT NULL,
      `heure_projet_debut` TIME NOT NULL,
      `heure_projet_fin` TIME NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_2`
        FOREIGN KEY (`id_langue`)
        REFERENCES `BDD`.`LANGUE` (`id_langue`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_3`
        FOREIGN KEY (`id_tache`)
        REFERENCES `BDD`.`TACHE` (`id_tache`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MOT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MOT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_mot` INT NOT NULL,
      `nbmots` INT(10) NOT NULL,
      `tarif_mot` DECIMAL(4,4) NOT NULL,
      `match` VARCHAR(30) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`, `id_mot`),
      CONSTRAINT `fk_MOT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`HEURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`HEURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `nbheure` INT NOT NULL,
      `tarif_heure` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_HEURE_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FORFAIT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FORFAIT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `tarif_forfait` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_FORFAIT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PAYPAL`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PAYPAL` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `frais_paypal` DECIMAL(10,2) NOT NULL,
      `chemin_paypal_pdf` VARCHAR(250) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_PAYPAL_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MONNAIE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MONNAIE` (
      `id_monnaie` INT NOT NULL AUTO_INCREMENT,
      `monnaie` VARCHAR(15) NOT NULL,
      PRIMARY KEY (`id_monnaie`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE_CHANGE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `total_net_change` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_FACTURE_CHANGE_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_FACTURE_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET_CHANGE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `taux_change_projet` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_CHANGE_1`
        FOREIGN KEY (`id_client`,`id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`,`id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_PROJET_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`LIGNE_FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`LIGNE_FACTURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_facture` INT NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_LIGNE_FACTURE_1`
        FOREIGN KEY (`id_client`,`id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`,`id_facture`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_LIGNE_FACTURE_2`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`, `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`AVOIR`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`AVOIR` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `montant_avoir` DECIMAL(10,2) NOT NULL,
      `commentaires_avoir` VARCHAR(150) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_AVOIR_1`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`LIGNE_FACTURE` (`id_client`, `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -------------------------------------------------------------------------------------------
    -- Le délimiteur entre instructions CREATE n’est plus le « ; » mais « GO » :
    -- -------------------------------------------------------------------------------------------
    COMMIT ;
    DELIMITER GO
    
    CREATE TRIGGER  PROJET_INCREMENT_TR BEFORE INSERT ON  PROJET 
    FOR EACH ROW
        BEGIN 
            SET NEW.id_projet = (SELECT COALESCE(MAX(id_projet) + 1, 1)  
                                     FROM   PROJET 
                                     WHERE  id_client = NEW.id_client) ;
        END
     
    GO
    
    CREATE TRIGGER MOT_EXCLUSION_TR BEFORE INSERT  ON MOT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps un forfait.' ;
        END IF ;
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   HEURE 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps une heure.' ;
        END IF ;
        
       -- partie identification relative 
         
            SET NEW.id_mot = (SELECT COALESCE(MAX(id_mot) + 1, 1)  
                             FROM   MOT 
                             WHERE  id_client = NEW.id_client AND id_projet = NEW.id_projet) ;
    END ;
    
    GO
    
    CREATE TRIGGER FORFAIT_EXCLUSION_TR BEFORE INSERT  ON FORFAIT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   HEURE 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps une heure.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    
    GO
    
    CREATE TRIGGER HEURE_EXCLUSION_TR BEFORE INSERT  ON HEURE
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Une heure ne peut pas être en même temps un forfait.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Une heure ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    J'ai remarqué que si on ne précise pas le nombre pour l'INT des clés primaires, c'est 11 par défaut, logique ?

    Merci,
    Orygynz

  19. #79
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    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 : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut Cascades en tous genres
    Bonsoir orygynz,



    Citation Envoyé par orygynz Voir le message
    Pour les RESTRICT, CASCADE ... Je déteste les trucs automatiques ! Voilà pourquoi je mets toujours RESTRICT...
    Comme dit l’autre : « Dans le doute il faut s’abstenir ». A son tour, Wittgenstein a fourni son axiome numéro 7 : « Sur ce dont on ne peut parler, il faut garder le silence » (cf. son Tractatus logico-philosophicus).

    Sur ces bonnes paroles, considérons le cas suivant :

    Une table S des salariés de l’entreprise comporte notamment une colonne utilisée pour la prime de bilan des directeurs. Si on vire le directeur Raoul, dans S on supprime la ligne qui concerne ce malheureux, et on n’en parle plus (aux prud’hommes près ^^).

    Pour un tas de raisons, sans hésiter, on préférera loger les primes de bilans dans une table ad-hoc, appelons-la P. Cette table sera dotée d’une clé étrangère faisant référence à S. Si on code RESTRICT, pour supprimer Raoul, il faudra cette fois-ci commencer par faire le ménage dans la table P avant de le faire dans S. En passant, au niveau conceptuel, on dit que P est une entité-type faible, en l’occurrence une propriété déguisée en entité-type et P n’a alors aucune raison de s’opposer à la destruction de Raoul : au niveau SQL, CASCADE s’impose.

    En revanche, une entité-type comme FACTURE est assez forte pour être dotée d’un RESTRICT dans sa référence à CLIENT. En effet, si on utilisait CASCADE, la suppression d’un client entraînerait la suppression de ses factures, ce qui serait gênant (plus pour vous d’ailleurs que pour lui...)

    Concernant les tables MOT, HEURE, FORFAIT : les entités-types correspondantes sont bien des entités-types faibles des propriétés de PROJET, ce qui justifie le CASCADE que vous avez conservé (même chose pour PAYPAL et AVOIR).

    Par contre, coder « ON UPDATE CASCADE »ne se justifie pas particulièrement, puisqu’on a pris soin d’utiliser des clés primaires dont les valeurs ne peuvent pas être changées (cf. la règle d’or Tabourier).


    Table FACTURE_CHANGE : la clé étrangère référençant la tale MONNAIE est dotée d’un CASCADE : est-ce bien raisonnable ? (Même chose au sujet de PROJET_CHANGE...)


    Dans « UNIQUE INDEX num_facture_UNIQUE (num_facture ASC) », le mot « INDEX » ne fait pas partie de la norme SQL, il est du niveau physique, si vous pouviez le virer, je loucherais moins...



    Citation Envoyé par orygynz Voir le message
    J'ai remarqué que si on ne précise pas le nombre pour l'INT des clés primaires, c'est 11 par défaut, logique ?
    Si j’utilise DB2 ou SQL Server, il n’y a pas de INT(n) qui tienne, INT coûte un mot (de 4 octets) et c’est tout, ce qui suffit pour des valeurs n’excédant pas (2 147 483 647). Je suppose qu’avec MySQL, coder INT(1) ou INT(11) coûtera 4 octets pour le stockage, comme chez les autres, mais qu’avec INT(n), on ne manipulera que n chiffres (une sorte de raffinement...) Cela dit, ce n’est que supposition de ma part, seul quelqu’un connaissant bien MySQL pourrait vous éclairer de façon pertinente.


    Bon, ça prend tournure.


    Et bonne année 2015 !
    (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.

  20. #80
    Invité
    Invité(e)
    Par défaut
    Bonne année !!

    On y arrive à la fin !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    -- -----------------------------------------------------
    -- Schema BDD
    -- -----------------------------------------------------
    CREATE SCHEMA IF NOT EXISTS `BDD` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
    USE `BDD` ;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PAYS`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PAYS` (
      `id_pays` INT NOT NULL AUTO_INCREMENT,
      `pays` VARCHAR(30) NOT NULL,
      PRIMARY KEY (`id_pays`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`CLIENT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`CLIENT` (
      `id_client` INT NOT NULL AUTO_INCREMENT,
      `id_pays` INT NOT NULL,
      `raison_sociale` VARCHAR(50) NOT NULL,
      `adresse` VARCHAR(50) NOT NULL,
      `code_postal` VARCHAR(10) NOT NULL,
      `ville` VARCHAR(30) NOT NULL,
      `numero_tva` VARCHAR(20) NOT NULL,
      `delai_paiement_def` INT(2) NOT NULL,
      `type_paiement_def` VARCHAR(20) NOT NULL,
      `aff_total_mots_def` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_client`),
      CONSTRAINT `fk_CLIENT_1`
        FOREIGN KEY (`id_pays`)
        REFERENCES `BDD`.`PAYS` (`id_pays`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `num_facture` VARCHAR(15) NOT NULL,
      `date_facture` DATE NOT NULL,
      `total_net` DECIMAL(10,2) NOT NULL,
      `date_paiement` DATE NOT NULL,
      `type_paiement` VARCHAR(20) NOT NULL,
      `delai_paiement` INT(2) NOT NULL,
      `chemin_facture_pdf` VARCHAR(254) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      UNIQUE `num_facture_UNIQUE` (`num_facture` ASC),
      CONSTRAINT `fk_FACTURE_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`TACHE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`TACHE` (
      `id_tache` INT NOT NULL AUTO_INCREMENT,
      `tache` VARCHAR(50) NOT NULL,
      `affichage_langue_facture` TINYINT(1) NOT NULL,
      PRIMARY KEY (`id_tache`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`LANGUE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`LANGUE` (
      `id_langue` INT NOT NULL AUTO_INCREMENT,
      `langue` VARCHAR(30) NOT NULL,
      PRIMARY KEY (`id_langue`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_langue` INT NOT NULL,
      `id_tache` INT NOT NULL,
      `reference` VARCHAR(150) NOT NULL,
      `description_projet` VARCHAR(255) NOT NULL,
      `date_projet_debut` DATE NOT NULL,
      `date_projet_fin` DATE NOT NULL,
      `heure_projet_fin` TIME NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_1`
        FOREIGN KEY (`id_client`)
        REFERENCES `BDD`.`CLIENT` (`id_client`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_2`
        FOREIGN KEY (`id_langue`)
        REFERENCES `BDD`.`LANGUE` (`id_langue`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT,
      CONSTRAINT `fk_PROJET_3`
        FOREIGN KEY (`id_tache`)
        REFERENCES `BDD`.`TACHE` (`id_tache`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MOT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MOT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_mot` INT NOT NULL,
      `nbmots` INT(10) NOT NULL,
      `tarif_mot` DECIMAL(4,4) NOT NULL,
      `match` VARCHAR(30) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`, `id_mot`),
      CONSTRAINT `fk_MOT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`HEURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`HEURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `nbheure` INT NOT NULL,
      `tarif_heure` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_HEURE_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FORFAIT`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FORFAIT` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `tarif_forfait` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_FORFAIT_1`
        FOREIGN KEY (`id_client` , `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client` , `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PAYPAL`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PAYPAL` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `frais_paypal` DECIMAL(10,2) NOT NULL,
      `chemin_paypal_pdf` VARCHAR(250) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_PAYPAL_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`MONNAIE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`MONNAIE` (
      `id_monnaie` INT NOT NULL AUTO_INCREMENT,
      `monnaie` VARCHAR(15) NOT NULL,
      PRIMARY KEY (`id_monnaie`))
    ENGINE = InnoDB;
    
    -- -----------------------------------------------------
    -- Table `BDD`.`FACTURE_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`FACTURE_CHANGE` (
      `id_client` INT NOT NULL,
      `id_facture` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `total_net_change` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_facture`),
      CONSTRAINT `fk_FACTURE_CHANGE_1`
        FOREIGN KEY (`id_client`, `id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`, `id_facture`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_FACTURE_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`PROJET_CHANGE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`PROJET_CHANGE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_monnaie` INT NOT NULL,
      `taux_change_projet` DECIMAL(4,4) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_PROJET_CHANGE_1`
        FOREIGN KEY (`id_client`,`id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`,`id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_PROJET_CHANGE_2`
        FOREIGN KEY (`id_monnaie`)
        REFERENCES `BDD`.`MONNAIE` (`id_monnaie`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`LIGNE_FACTURE`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`LIGNE_FACTURE` (
      `id_client` INT NOT NULL,
      `id_projet` INT NOT NULL,
      `id_facture` INT NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_LIGNE_FACTURE_1`
        FOREIGN KEY (`id_client`,`id_facture`)
        REFERENCES `BDD`.`FACTURE` (`id_client`,`id_facture`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_LIGNE_FACTURE_2`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`PROJET` (`id_client`, `id_projet`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `BDD`.`AVOIR`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `BDD`.`AVOIR` (
      `id_client` INT NULL,
      `id_projet` INT NULL,
      `montant_avoir` DECIMAL(10,2) NOT NULL,
      `commentaires_avoir` VARCHAR(150) NOT NULL,
      PRIMARY KEY (`id_client`, `id_projet`),
      CONSTRAINT `fk_AVOIR_1`
        FOREIGN KEY (`id_client`, `id_projet`)
        REFERENCES `BDD`.`LIGNE_FACTURE` (`id_client`, `id_projet`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -------------------------------------------------------------------------------------------
    -- Le délimiteur entre instructions CREATE n’est plus le « ; » mais « GO » :
    -- -------------------------------------------------------------------------------------------
    COMMIT ;
    DELIMITER GO
    
    CREATE TRIGGER  PROJET_INCREMENT_TR BEFORE INSERT ON  PROJET 
    FOR EACH ROW
        BEGIN 
            SET NEW.id_projet = (SELECT COALESCE(MAX(id_projet) + 1, 1)  
                                     FROM   PROJET 
                                     WHERE  id_client = NEW.id_client) ;
        END
     
    GO
    
    CREATE TRIGGER MOT_EXCLUSION_TR BEFORE INSERT  ON MOT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps un forfait.' ;
        END IF ;
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   HEURE 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un mot ne peut pas être en même temps une heure.' ;
        END IF ;
        
       -- partie identification relative 
         
            SET NEW.id_mot = (SELECT COALESCE(MAX(id_mot) + 1, 1)  
                             FROM   MOT 
                             WHERE  id_client = NEW.id_client AND id_projet = NEW.id_projet) ;
    END ;
    
    GO
    
    CREATE TRIGGER FORFAIT_EXCLUSION_TR BEFORE INSERT  ON FORFAIT
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   HEURE 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps une heure.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Un forfait ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    
    GO
    
    CREATE TRIGGER HEURE_EXCLUSION_TR BEFORE INSERT  ON HEURE
    FOR EACH ROW 
    BEGIN
        SET @N = (
                  SELECT COUNT(*) 
                  FROM   FORFAIT 
                  WHERE  id_client = NEW.id_client
                    AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Une heure ne peut pas être en même temps un forfait.' ;
        END IF ;	
         SET @N = (
                   SELECT COUNT(*) 
                   FROM   MOT 
                   WHERE  id_client = NEW.id_client
                     AND  id_projet = NEW.id_projet
                 ) ;
        IF  @N > 0 THEN
            SIGNAL   SQLSTATE '45001' SET MESSAGE_TEXT = 'Une heure ne peut pas être en même temps un mot.' ;
        END IF ;
     
    END ;
    Merci

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

Discussions similaires

  1. [AC-2013] Débutant-Validation modélisation BDD inventaire d'optique
    Par Femtozaza dans le forum Modélisation
    Réponses: 55
    Dernier message: 07/05/2015, 17h50
  2. validation diagramme de classe d'une clinique
    Par elqorchi-najoua dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 12/10/2010, 12h36
  3. Validation diagrammes : use case
    Par nizar_grindi dans le forum Cas d'utilisation
    Réponses: 1
    Dernier message: 30/03/2010, 23h36
  4. Question et validation diagramme simple (débutant)
    Par dorian53 dans le forum Cas d'utilisation
    Réponses: 2
    Dernier message: 24/03/2010, 10h54
  5. validation diagramme de classe
    Par kokumbo dans le forum Diagrammes de Classes
    Réponses: 13
    Dernier message: 11/10/2009, 23h39

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