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

MySQL Discussion :

Contrainte check sur attribut


Sujet :

MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut Contrainte check sur attribut
    Bonjour, je suis en train de développer une base de donnée sous mysql. Je souhaite ajouter des contraintes de domaine de valeurs sur certains attributs et cela ne fonctionne pas.

    J'ai beau essayer de mettre n'importe quoi sur ces attributs et ça écrit quand même. J'ai fais pas mal de recherche depuis hier mais il y a pas grand chose à ce sujet. Merci d'avance de votre réponse.

    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE Conteneur(
    `identifiantConteneur` CHAR(6),
    `client` CHAR(9) NOT NULL,
    `emplacement` CHAR(10),
    `nombrePresent` INTEGER(2) NOT NULL,
    `etat` CHAR(9) NOT NULL CHECK (etat IN('COMPLET', 'PARTIEL', 'SUPPRIME', 'VIDE'))
    );
    ALTER TABLE Conteneur ADD PRIMARY KEY (identifiantConteneur, client);

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE Conteneur(
    `identifiantConteneur` CHAR(6),
    `client` CHAR(9) NOT NULL,
    `emplacement` CHAR(10),
    `nombrePresent` INTEGER(2) NOT NULL,
    `etat` CHAR(9) NOT NULL,
     Constraint CHK_ETAT  CHECK (etat IN('COMPLET', 'PARTIEL', 'SUPPRIME', 'VIDE')),
    Constraint PK_CONTENEUR PRIMARY KEY (identifiantConteneur, client);
    );

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Merci pour ta réponse, mais non je peux toujours faire entrer n'importe quoi...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    Je viens de trouver une information qui dit que Mysql implémente Check
    mais la clause n'est pas considérée d'où ton problème.

    Il propose une alternative c'est ENUM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    CREATE TABLE Conteneur(
    `identifiantConteneur` CHAR(6),
    `client` CHAR(9) NOT NULL,
    `emplacement` CHAR(10),
    `nombrePresent` INTEGER(2) NOT NULL,
    `etat` CHAR(9) NOT NULL ENUM ('COMPLET', 'PARTIEL', 'SUPPRIME', 'VIDE'),
    Constraint PK_CONTENEUR PRIMARY KEY (identifiantConteneur, client);
    );

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    J'avais aussi vu cet article. J'avais fais comme toi, et ça génère une erreur de syntaxe. En fait il faut créer une autre table avec un attribut. C'est ça l'énumération. Mais ils n'expliquent pas le lien avec une autre table.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    En fait il faut créer un autre table avec un attribut
    Non, je pense que tu as mal saisi l'information.

    Si tu exécutes le script de création de table quelle erreur est générée?

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    ERROR 1064 (42000): 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 'ENUM
    ('COMPLET', 'PARTIEL', 'SUPPRIME', 'VIDE'),
    Constraint PK_CONTENEUR PRIMARY' at line 6
    Il aime pas passer du not null à enum

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 45
    Points
    45
    Par défaut
    Bonjour

    Le problème viens du fait que du déclare 2 types : char(9) et ENUM, la solution étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE Conteneur(
    `identifiantConteneur` CHAR(6),
    `client` CHAR(9) NOT NULL,
    `emplacement` CHAR(10),
    `nombrePresent` INTEGER(2) NOT NULL,
    `etat`ENUM ('COMPLET', 'PARTIEL', 'SUPPRIME', 'VIDE') NOT NULL,
    Constraint PK_CONTENEUR PRIMARY KEY (identifiantConteneur, client)
    );

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Super, ça marche
    Maintenant j'ai 2 autres questions,
    comment je peux vérifier un nombre toujours positif, et faire en sorte qu'un attribut est toujours plus petit ou égal à un autre attribut de ma table.

    et

    comment vérifier qu'un attribut non clé d'une table soit égal à un autre attribut non clé d'un autre table si leurs clés sont égales (ça vient suite à une dé normalisation)


    Merci beaucoup

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 45
    Points
    45
    Par défaut
    Pour des problèmes de ce genre là il va te falloir utiliser des triggers qui vont faire les requêtes de vérification ON UPDATE et ON INSERT puis lancer un rollback si il y'a une incohérence.

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Oui, ça je l'ai fait. J'ai essayé le rollback mais c'est interdit dans un trigger
    http://dev.mysql.com/doc/refman/5.0/...-triggers.html

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 45
    Points
    45
    Par défaut
    Dans ce cas, tu fais ton trigger BEFORE X et tu lances une erreur..

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    lancer une erreur par un raise application error ou abort?

  14. #14
    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
    C'est expliqué dans le tutoriel suivant : http://alain-defrance.developpez.com...egre-error/#LV

    ced
    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

  15. #15
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Merci beaucoup, ça peut marcher comme ça. Par contre j'ai une erreur de syntaxe que je n'arrive pas du tout à corriger. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE no_conteneur CONDITION FOR SQLSTATE '45000';
    DECLARE EXIT HANDLER FOR no_conteneur SET @error = 'Une boite sortie, rangée ou demandée est liée à un conteneur!';
     
    IF((NEW.etat='RANGEE' OR NEW.etat='SORTIE' OR NEW.etat='DEMANDEE') AND conteneur IS NULL) THEN 
    	SIGNAL no_conteneur;
    END IF;

    Le SGBD renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ERROR 1064 (42000): 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 'no_conteneur;
                    END IF;
                    IF (OLD.conteneur IS NULL AND NEW.conteneur IS NOT NUL' at line
    8
    J'ai bien lu cette page

    http://dev.mysql.com/doc/refman/5.5/en/signal.html

  16. #16
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Je n'ai toujours pas trouvé la solution, sur internet, c'est toujours la même syntaxe qui est utilisée. Je ne comprends rien !

Discussions similaires

  1. Avoir un message personnalisé sur une contrainte check
    Par brunoSCP dans le forum Débuter
    Réponses: 5
    Dernier message: 29/09/2016, 14h30
  2. Réponses: 2
    Dernier message: 05/04/2012, 10h54
  3. Valeur par défaut sur un attribut avec la contrainte check
    Par raffi88 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/11/2010, 17h46
  4. [Oracle 9i] contrainte CHECK sur le type date
    Par zchallal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/06/2006, 11h34
  5. contraint CHECK avec lecture de données sur une autre table ?
    Par mamiberkof dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/05/2006, 09h14

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