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

Requêtes MySQL Discussion :

creation des tables


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 124
    Points : 66
    Points
    66
    Par défaut creation des tables
    Salut à vous. Je suis en train de créer une base de données avec les tables suivantes avec leur différents attributs :
    Station (nomStation, capacité, lieu, région, tarif)
    – Activite (nomStation, libellé, prix)
    – Client (id, nom, prénom, ville, région, solde)
    – Sejour (id, station, début, nbPlaces)
    Ces tables doivent vérifier certaines contraintes parmi lesquelles à savoir :

    1- La destruction d’une station doit entraîner la destruction de ses activités et de ses séjours.
    2- Le prix d’une activité doit être inférieur au tarif de la station et supérieur à
    3-Pour une date de début donnée, le nombre total de places réservées dans une station doit être inférieur à la capacité de la station.

    j'ai pu créer ma base et ses tables mais je n'arrive pas à établir ces contraintes. C'est ainsi que je sollicite votre aide.

  2. #2
    Modérateur

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

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

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu as prévu un "id" dans les tables "Client" et "Sejour" ; c'est bien, en espérant que tu as bien choisi le type INTEGER agrémenté de AUTO_INCREMENT.

    Pourquoi n'en as-tu pas fait autant dans les tables "Station" et "Activite" ?

    Tes tables devraient donc avoir cette composition :
    - Station (id_station, nomStation, capacité, lieu, région, tarif)
    Activite (id_station, numero_activite, libellé, prix)
    Client (id, nom, prénom, ville, région, solde)
    Sejour (id, id_station, début, nbPlaces)
    Clés primaires soulignées et clés étrangères en italique.

    Tu devrais aussi créer une table pour les villes et une autre pour les régions afin d'éviter d'avoir plusieurs fois la même ville ou région avec des orthographes différentes.

    Règle de gestion :
    Une ville est située dans une seule région et une région peut situer plusieurs villes.

    MCD :
    ville -1,1----situer----0,n- region

    Tables :
    region (rgn_id, rgn_nom...)
    ville (vil_id, vil_id_region, vil_nom...)

    1- La destruction d’une station doit entraîner la destruction de ses activités et de ses séjours.
    Il faut donc une contrainte de clé étrangère.
    Première chose à vérifier avec MySQL : que les tables utilisent le moteur InnoDB car le moteur MyISAM ignore superbement les contraintes de clés étrangères bien que la syntaxe soit acceptée.

    Ensuite, pour créer une contrainte de clé étrangère, il faut que la colonne qui porte la clé étrangère soit indexée. Il est possible cependant que l'indexation soit automatique à la création de la clé. À vérifier.

    Enfin, pour que la suppression d'une station entraîne la suppression des lignes des autres tables qui référencent la station, il faut utiliser la clause ON DELETE CASCADE en même temps que la création de la clé étrangère.

    2- Le prix d’une activité doit être inférieur au tarif de la station et supérieur à
    Supérieur à quoi ?
    Ici par contre, tu n'as pas choisi le bon SGBD puisque le mauvais MySQL ne connaît toujours pas les contraintes CHECK alors que, là aussi, il en accepte la syntaxe !
    Tu vas donc devoir programmer un trigger avant insertion pour vérifier cette contrainte.
    Bon courage !

    3-Pour une date de début donnée, le nombre total de places réservées dans une station doit être
    inférieur à la capacité de la station.
    Idem, avec le mauvais MySQL : trigger !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tu vas donc devoir programmer un trigger avant insertion pour vérifier cette contrainte.
    Bon courage !
    ...
    Idem, avec le mauvais MySQL : trigger !
    Mouais...

    Pas certain qu'il aurait été vraiment plus simple d'écrire ses deux contraintes avec CONSTRAINT CHECK plutôt que dans trigger.

    Je me trompe ?

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Mouais...

    Pas certain qu'il aurait été vraiment plus simple d'écrire ses deux contraintes avec CONSTRAINT CHECK plutôt que dans trigger.

    Je me trompe ?
    Oui, parce que la contrainte CHECK, dans MySQL, est juste là pour "faire joli" et n'est pas vérifiée.
    Extrait de la documentation MySQL 5.5 :
    The CHECK clause is parsed but ignored by all storage engines
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ced Voir le message
    Oui, parce que la contrainte CHECK, dans MySQL, est juste là pour "faire joli" et n'est pas vérifiée.
    Je sais bien.

    Mais si elle avait été gérée est ce que cela aurait été vraiment plus simple de l'utiliser ?

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 124
    Points : 66
    Points
    66
    Par défaut creation des tables
    Salut à vous. Voici comment j'ai créé mes tables :

    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
    CREATE table station (nomstation varchar(40), capacite int(11) not null, lieu varchar(40) not null, region enum('ocean indien', 'Antilles','Europe','Ameriques', 'Extreme Orient'), 
    tarif float default 0,
    UNIQUE (lieu,region),
    constraint pkstation PRIMARY KEY (nomstation));
     
     
    create table activite (idactivite int(11) not null AUTO_INCREMENT , nomstation varchar(40) not null, libelle varchar(40) not null, prix float DEFAULT 0 not NULL ,
    check (prix BETWEEN 0 and station.tarif ),
    CONSTRAINT pkactivite primary key(idactivite),
     CONSTRAINT fkactivite FOREIGN key (nomstation) REFERENCES station (nomstation) on delete cascade);
     
     
    create table sejour (id int(11) not null, nomstation varchar(40), debut date not null, nbplaces int(11) not null ,
    CHECK (nbplaces<sation.capacite),
    constraint pksejour primary key(id, nomstation),
        foreign key (id) references clients (id) on delete cascade,
        FOREIGN key (nomstation) references station (nomstation) on delete cascade);
    J'ai du mal à créer un trigger. J'ai utilisé CHECK, mais aucun contrôle ne fonctionne.
    C'est-à-dire que je n'arrive pas à supprimer la table station, car elle est liée à la table activité, bien que j'ai mis on delete cascade.
    Merci d'avance

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    La contrainte CHECK est sans effets sous MySQL.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Tu devrais lire plus attentivement le message de Cinephil. Notamment ceci:
    Citation Envoyé par CinePhil Voir le message
    Première chose à vérifier avec MySQL : que les tables utilisent le moteur InnoDB car le moteur MyISAM ignore superbement les contraintes de clés étrangères bien que la syntaxe soit acceptée.
    Citation Envoyé par CinePhil Voir le message
    Enfin, pour que la suppression d'une station entraîne la suppression des lignes des autres tables qui référencent la station, il faut utiliser la clause ON DELETE CASCADE en même temps que la création de la clé étrangère.

    Tu penses vraiment que :
    Pour une date de début donnée, le nombre total de places réservées dans une station doit être inférieur à la capacité de la station.
    se résume à ceci: CHECK (nbplaces<sation.capacite) ?

    Avant de te lancer dans les Triggers, tu devrais commencer par essayer d'écrire tes contraintes en requête.

Discussions similaires

  1. creation des tables
    Par fabricen26 dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/12/2012, 19h59
  2. creation des tables radius avec freeradius
    Par Abou Zar dans le forum Debian
    Réponses: 0
    Dernier message: 24/11/2012, 15h21
  3. Probleme dans la creation des tables
    Par sousan dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/12/2009, 17h27
  4. Cours sur la creation des bases et tables sous oracle
    Par boussaad dans le forum Oracle
    Réponses: 1
    Dernier message: 30/07/2006, 11h18
  5. [HIBERNATE] Création des tables
    Par Solovely dans le forum Hibernate
    Réponses: 7
    Dernier message: 19/10/2005, 19h05

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