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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 4
    Points : 2
    Points
    2

    Par défaut MySQL Workbench débutant

    onjour,

    Merci d'avance pour l'aide. Je suis débutant en base de données.

    Voici mon problème, j'utilise le logiciel MySQL Workbench. J'ai une table avec plusieurs champs

    Nom de la table: pci

    Les différents champs de la table sont:

    AAA BBB block_id

    blade_id

    Donc mon problème est que block_id et blade_id ne peuvent avoir deux même valeurs. Savez-vous comment je peux faire cela pour le configurer dans MySQL Workbench.

    Sachant que les tables block et blade existent avec d'autre champs.
    En gros:

    block_id= Null

    blade_id= 1

    ou

    block_id=2

    blade_id=Null

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    4 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 4 034
    Points : 12 113
    Points
    12 113

    Par défaut

    Salut kad25.

    Citation Envoyé par kad25
    mon problème est que block_id et blade_id ne peuvent avoir deux même valeurs.
    Si je comprends bien votre problème, ces deux noms de colonnes sont des identifiants de vos tables respectives "block" et "blade".

    Que représente pour vous la table "PCI" ? Est-ce une table association ?
    Si c'est le cas, vous devez utiliser des clefs étrangères afin de définir l'intégrité des valeurs de ces deux colonnes "block_id" et "blade_id".
    En conséquence de quoi, il ne sera pas possible de marquer à NULL ces deux colonnes. Pourquoi ?
    Car dans les tables "block" et "blade", les colonnes "block_id" et "blade_id" sont des clefs primaires.
    Une clef primaire doit être unique et pas de NULL !
    Et par conséquent, les valeurs misent dans la table "PCI" doivent être impérativement celles qui sont présentes dans les tables "block" et "blade".

    Citation Envoyé par kad25
    Savez-vous comment je peux faire cela pour le configurer dans MySQL Workbench.
    Avant de vous indiquer une solution, il faudrait comprendre pourquoi désirez-vous ne pas avoir la même valeur dans ces deux colonnes ?

    Les colonnes "block_id" et "blade_id" sont des identifiants. Ces deux colonnes ont une gestion indépendante.

    Détaillez nous la nature de votre problème, et non juste ce que vous voulez faire.
    Il est fort probable que votre base de données soit mal conçue !
    C'est sur ce point que vous devez revoir l'organisation de vos données.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Bonjour,
    Merci pour votre réponse.

    Ces deux noms de colonnes sont des identifiants des tables respectives "block" et "blade".
    La table PCI est une table d'association avec block_id et blade_id et d'autre champs qui sont relié à d'autre table, mais possède aussi ces propres champs.
    En faite c'est deux informations différentes. ces infos renseignent la même table PCI. Pour une ligne donné on peut pas retrouvé les deux informations.

    Sur les deux clés il faut autoriser une valeur par défaut une valeur nulle. Si la clé n’est pas nulle alors il faut que ce que soit une clé étrangère. Pour blocksio_id il faut pointer vers un id de la table blocksio et pour Blades_id il faut que ce soit un id de la table blades

    Espérant que cela vous a mieux éclairer.

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    4 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 4 034
    Points : 12 113
    Points
    12 113

    Par défaut

    Salut kad25.

    Citation Envoyé par kad25
    Espérant que cela vous a mieux éclairer.
    Pas vraiment, car je n'arrive pas à comprendre pourquoi vous avez cette contrainte !
    N'y a-t-il pas une amélioration à faire en fusionnant vos deux tables 'block' et 'blade' ?

    J'avais pensé à utiliser "check" mais sous mysql, cela ne fonctionne pas :
    Citation Envoyé par MySql
    The CHECK clause is parsed but ignored by all storage engines.
    Du coup, j'ai pensé au trigger; comme ci-après :
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `block`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `block`
    ( `id`    integer unsigned not null auto_increment primary key,
      `lib`   varchar(255)     not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `block` (`lib`) values ('un'),('deux')
    --------------
     
    --------------
    select * from `block`
    --------------
     
    +----+------+
    | id | lib  |
    +----+------+
    |  1 | un   |
    |  2 | deux |
    +----+------+
    --------------
    DROP TABLE IF EXISTS `blade`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `blade`
    ( `id`    integer unsigned not null auto_increment primary key,
      `lib`   varchar(255)     not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `blade` (`lib`) values ('one'),('two')
    --------------
     
    --------------
    select * from `blade`
    --------------
     
    +----+-----+
    | id | lib |
    +----+-----+
    |  1 | one |
    |  2 | two |
    +----+-----+
    --------------
    DROP TABLE IF EXISTS `pci`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `pci`
    ( `id`        integer unsigned not null auto_increment primary key,
      `id_block`  integer unsigned     null,
      `id_blade`  integer unsigned     null,
      `lib`       varchar(255)     not null,
      CONSTRAINT `FK_BLOCK` FOREIGN KEY (`id_block`) REFERENCES `block` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
      CONSTRAINT `FK_BLADE` FOREIGN KEY (`id_blade`) REFERENCES `blade` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verify`
    --------------
     
    --------------
    CREATE TRIGGER `verify`
    BEFORE INSERT ON `pci`
    FOR EACH ROW
    BEGIN
      DECLARE _msg  varchar(255);
     
      IF (new.id_block = new.id_blade) then
         set _msg = concat('Même valeur, insertion interdite !');
         SIGNAL SQLSTATE VALUE '07777' SET MESSAGE_TEXT = _msg, MYSQL_ERRNO = 7777;
      END IF;
     
      IF ((new.id_block is not null) and (new.id_blade is not null)) then
         set _msg = concat('C''est l''une ou l''autre mais pas les deux colonnes à la fois !');
         SIGNAL SQLSTATE VALUE '07777' SET MESSAGE_TEXT = _msg, MYSQL_ERRNO = 7777;
      END IF;
     
      IF ((new.id_block is null) and (new.id_blade is null))  then
         set _msg = concat('Vous devez renseigner au moins l''une des deux colonnes !');
         SIGNAL SQLSTATE VALUE '07777' SET MESSAGE_TEXT = _msg, MYSQL_ERRNO = 7777;
      END IF;
    END
    --------------
     
    --------------
    insert into `pci` (`id_block`,`id_blade`,`lib`) values (   1, null, 'nombre 1 en français')
    --------------
     
    --------------
    insert into `pci` (`id_block`,`id_blade`,`lib`) values (null,    2, 'nombre 2 en anglais')
    --------------
     
    --------------
    insert into `pci` (`id_block`,`id_blade`,`lib`) values (null, null, 'nombre 1 en français')
    --------------
     
    ERROR 7777 (07777) at line 119: Vous devez renseigner au moins l'une des deux colonnes !
    --------------
    insert into `pci` (`id_block`,`id_blade`,`lib`) values (   1,    1, 'nombre 1 en français')
    --------------
     
    ERROR 7777 (07777) at line 120: Même valeur, insertion interdite !
    --------------
    insert into `pci` (`id_block`,`id_blade`,`lib`) values (   2,    2, 'nombre 2 en anglais')
    --------------
     
    ERROR 7777 (07777) at line 121: Même valeur, insertion interdite !
    --------------
    insert into `pci` (`id_block`,`id_blade`,`lib`) values (   1,    2, 'nombre 2 en anglais')
    --------------
     
    ERROR 7777 (07777) at line 122: C'est l'une ou l'autre mais pas les deux colonnes à la fois !
    --------------
    select * from `pci`
    --------------
     
    +----+----------+----------+----------------------+
    | id | id_block | id_blade | lib                  |
    +----+----------+----------+----------------------+
    |  1 |        1 |     NULL | nombre 1 en français |
    |  2 |     NULL |        2 | nombre 2 en anglais  |
    +----+----------+----------+----------------------+
    --------------
    select t1.id,
           t1.lib,
           t2.lib,
           t3.lib
     
    from pci as t1
     
    left outer join block as t2
    on t2.id = t1.id_block
     
    left outer join blade as t3
    on t3.id = t1.id_blade
    --------------
     
    +----+----------------------+------+------+
    | id | lib                  | lib  | lib  |
    +----+----------------------+------+------+
    |  1 | nombre 1 en français | un   | NULL |
    |  2 | nombre 2 en anglais  | NULL | two  |
    +----+----------------------+------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    P.S.: si quelqu'un a mieux à proposer, je suis preneur.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Bonjour Artemus24,
    Merci pour votre réponse.

    En faite, j'ai découvert cette contrainte après la création de la base de données. J'ai créé la base de données puis le développeur a programmé à sa façon. Au début, on savait pas comment allait être gérées ces tables. C'est pour cela que je cherche une façon pour arranger cela. Refaire une nouvelle base prendrait du temps, car le produit doit être livré bientôt.

    Les informations dans ces deux tables sont différentes.

    Mais je vais essayer avec tes différents remarques.

  6. #6
    Membre chevronné
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    février 2008
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2008
    Messages : 898
    Points : 2 200
    Points
    2 200

    Par défaut

    Bonjour
    Vous écrivez :
    C'est pour cela que je cherche une façon pour arranger cela. Refaire une nouvelle base prendrait du temps, car le produit doit être livré bientôt.
    Je pense que c'est une très très très grosse erreur.
    Si une base est livrée alors qu'elle est mal concçue, vous allez au-devant d'énormes problèmes.

    Je pense qu'il vaut mieux, soit donner un coup d'accélérateur, refaire une base correcte et la livré à temps; soit la livrer correcte plus tard, avec un délai.

    Pierre

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Bonjour,
    Ok d'accord.
    C'est parti alors, je vais refaire une base correcte. Je vous remercie.

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    4 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 4 034
    Points : 12 113
    Points
    12 113

    Par défaut

    Salut Kad25.

    Dans la conception d'une base de données, il y a deux phases que l'on doit faire avant le début des développements :

    1) le modèle conceptuel des données (MCD).
    Il s'agit de définir l'organisation des données au sein de la base à partir des contraintes fonctionnelles.
    Même si cela entraîne par la suite, le modèle physique des données, cela reste théorique.

    2) le modèle conceptuel des traitements (MCT).
    C'est cette phase qui est souvent oublié, voire totalement délaissée.
    Il s'agit de créer les requêtes qui vont servir dans le développement.
    C'est cette phase qui va confirmer les bons choix de l'organisation du MCD.
    Mais c'est là que l'on résout les problèmes de performances, de la dégradation de la base, ou encore de la création des partitions ...

    Normalement, quand le MCD et le MCT ont été validés, on peut commencer à faire les développements.
    Ce MCD et ce MCT est à la charge du DBA et c'est son boulot de préparer le terrain avant les développements.
    Normalement, le développeur ne doit pas se poser des questions de faisabilités, car ce n'est pas son boulot.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. [MySQL-5.5] débutant mysql workbench entité-association modélisation
    Par prikama dans le forum Outils
    Réponses: 4
    Dernier message: 11/03/2013, 15h52
  2. installation MySQL workbench
    Par fripette dans le forum Installation
    Réponses: 1
    Dernier message: 12/04/2011, 14h59
  3. Réponses: 5
    Dernier message: 18/11/2009, 13h50
  4. Mysql workbench vs mysql administrateur
    Par juin29 dans le forum Outils
    Réponses: 1
    Dernier message: 21/10/2008, 13h47
  5. Réponses: 1
    Dernier message: 29/10/2007, 14h23

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