Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 17/03/2010, 09h27   #1
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
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 :
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);

Dernière modification par ced ; 17/03/2010 à 09h35. Motif: Merci d'utiliser la balise [CODE] (bouton #)
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 12h07   #2
Membre actif
 
Inscription : juillet 2007
Messages : 135
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 135
Points : 150
Points : 150
Essaie ceci :

Code :
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);
);
teach est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 12h22   #3
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
Merci pour ta réponse, mais non je peux toujours faire entrer n'importe quoi...
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 12h56   #4
Membre actif
 
Inscription : juillet 2007
Messages : 135
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 135
Points : 150
Points : 150
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 :
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);
);
teach est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 14h07   #5
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
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.
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 14h38   #6
Membre actif
 
Inscription : juillet 2007
Messages : 135
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 135
Points : 150
Points : 150
Citation:
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?
teach est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 15h21   #7
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
Citation:
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

Dernière modification par al1_24 ; 17/03/2010 à 23h25. Motif: Balises QUOTE
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 15h45   #8
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 39
Points : 32
Points : 32
Bonjour

Le problème viens du fait que du déclare 2 types : char(9) et ENUM, la solution étant :
Code :
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)
);
iGwendal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 15h54   #9
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
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
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 16h13   #10
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 39
Points : 32
Points : 32
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.
iGwendal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 16h47   #11
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
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
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 17h05   #12
Nouveau Membre du Club
 
Inscription : octobre 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 39
Points : 32
Points : 32
Dans ce cas, tu fais ton trigger BEFORE X et tu lances une erreur..
iGwendal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 17h30   #13
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
lancer une erreur par un raise application error ou abort?
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 19h47   #14
ced
Rédacteur/Modérateur
 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 778
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 778
Points : 6 213
Points : 6 213
C'est expliqué dans le tutoriel suivant : http://alain-defrance.developpez.com...egre-error/#LV

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 14h22   #15
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
Merci beaucoup, ça peut marcher comme ça. Par contre j'ai une erreur de syntaxe que je n'arrive pas du tout à corriger. :

Code :
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 :
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

Dernière modification par oneagaindoguys ; 18/03/2010 à 14h34.
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2010, 08h40   #16
Membre éclairé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 386
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 386
Points : 349
Points : 349
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 !
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 09h34.


 
 
 
 
Partenaires

Hébergement Web