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 :

Problème de contrainte suite a un effacement


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut Problème de contrainte suite a un effacement
    Bonjour a tous
    voici mon problème
    je crée des table et ensuite je crée des contrainte de clé étrangère.
    J'ai une clé étrangère dans ma table Clients sur la colonne Ref_NumerosGroupe
    qui me permet de savoir dans quel groupe se trouve mon client.

    J'ai un client qui se trouve dans le groupe 1.

    J'ai fais un test en supprimant le groupe 1 de la table GroupeClients.
    Le tuple se supprime sans problème.

    Normalement il ne devrais pas se supprimer vu que dans ma table client j'ai un client qui a dans la colonne Ref_NumerosGroupe le tuple 1.

    J'ai demander a ma prof et elle me dis que c'est a caus e de la version et le sgbd ne prend pas en compte les contrainte.

    Personnellement j'en doute mais qui c'est.

    J'ai essayé de chercher sur le net mais je ne trouve pas de réponse a se problème.

    J'utilise easyphp mysql version 5.1.43

    Si quelqu'in peux me dire le pourquoi ou si j'ai fais une erreur dans mon code

    Voici le code sql
    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
     
    CREATE TABLE GroupeClients
    (
    	NumerosGroupeClient					INTEGER 		NOT NULL 	AUTO_INCREMENT,
    	NomGroupe							VARCHAR(100),
    		PRIMARY KEY(NumerosGroupeClient)
    );
    CREATE TABLE Clients
    (
    	NumerosClient						INTEGER			NOT NULL 	AUTO_INCREMENT,
    	NomClient							VARCHAR(100),
    	Prenom								VARCHAR(100),
    	Rue									VARCHAR(100),
    	Npa									INTEGER(4),
    	Ville								VARCHAR(100),
    	Tel									VARCHAR(20),
    	Natel								VARCHAR(20),
    	Email								VARCHAR(100),
    	Ref_NumerosGroupe					INTEGER(10)		NOT NULL,
    		PRIMARY KEY(NumerosClient)
    );
     
    CREATE TABLE ExpediteurEmails
    (
    	NumerosExpediteur					INTEGER 		NOT NULL 	AUTO_INCREMENT,
    	Email								VARCHAR(100),
    	NomExpediteur						VARCHAR(100),
    	UserName							VARCHAR(100),
    	Password							VARCHAR(100),
    	Smtp								VARCHAR(100)		DEFAULT 'mail.kayenne.ch',
    	Port								INTEGER				DEFAULT '587',
    		PRIMARY KEY(NumerosExpediteur)
    );
     
    CREATE TABLE fileEmail
    (
    	NumerosFileEmail					INTEGER			NOT NULL	AUTO_INCREMENT,
    	NomFileEmail						VARCHAR(100),
    	Chemin								VARCHAR(100),
    	Ref_NumerosEmails					INTEGER			NOT NULL,
    		PRIMARY KEY(NumerosFileEmail)
    );
    CREATE TABLE Emails
    (
    	NumerosEmail						INTEGER			NOT NULL	AUTO_INCREMENT,
    	Ref_NumerosExpediteur				INTEGER			NOT NULL,
    	Ref_DestinataireClient				INTEGER,
    	Ref_DestinataireGroupeClients		INTEGER,
    	Sujet								VARCHAR(100),
    	Contenu								TEXT,
    		PRIMARY KEY(NumerosEmail)
    );
    CREATE TABLE Concours
    (
    	NumerosConcours						INTEGER 		NOT NULL 	AUTO_INCREMENT,
    	DateParticipation					DATE,
    	ValideReponse						INTEGER(1),
    	Ref_NumerosClient					INTEGER(10)		NOT NULL,
    		PRIMARY KEY(NumerosConcours)
    );
     
    CREATE TABLE Pages (
    	IdPage								INTEGER 		NOT NULL 	AUTO_INCREMENT ,
    	Titre 								VARCHAR(255) 	NOT NULL ,
    	Mots_cles							VARCHAR(255),
    	Description 						VARCHAR(255),
    	Chemin								VARCHAR(255) 	NOT NULL ,
    	Id_parent 							INTEGER 			DEFAULT '1' ,
    		PRIMARY KEY (IdPage)
    );
    ALTER TABLE Clients
    	ADD CONSTRAINT fk_Clients_GroupeClients
    		FOREIGN KEY (Ref_NumerosGroupe)
    		REFERENCES GroupeClients(NumerosGroupe);
     
     
    ALTER TABLE Concours
    	ADD CONSTRAINT fk_Concours_Clients
    		FOREIGN KEY (Ref_NumerosClient)
    		REFERENCES Clients(NumerosClients);
     
     
    ALTER TABLE Emails
    	ADD CONSTRAINT fk_Emails_ExpediteurEmails
    		FOREIGN KEY (Ref_NumerosExpediteur)
    		REFERENCES ExpediteurEmails(NumerosExpediteur);
     
     
    ALTER TABLE Emails
    	ADD CONSTRAINT fk_Emails_Clients
    		FOREIGN KEY (Ref_DestinataireClient)
    		REFERENCES Clients(NumerosClients);
     
     
    ALTER TABLE Emails
    	ADD CONSTRAINT fk_Emails_GroupeClients
    		FOREIGN KEY (Ref_DestinataireClient)
    		REFERENCES GroupeClients(NumerosGroupeClient);
     
     
    ALTER TABLE fileEmail
    	ADD CONSTRAINT fk_fileEmail_Emails
    		FOREIGN KEY (Ref_NumerosEmails)
    		REFERENCES Emails(NumerosEmails);
    voici les tuple que moi j'utilise comme test pour la table Clients et la table GroupeClients
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT INTO `clients` (`NomClient`, `Prenom`, `Rue`, `Npa`, `Ville`, `Tel`,`Natel`,`Email`, `Ref_NumerosGroupe`) VALUES
    ('Di Blasio', 'Michael', 'Clos-Fiola 2', '2735' , 'Malleray', '0324922175' , '0764721754' , 'diblasio.michael@gmail.com', 2),
    ('Di Blasio', 'Raffaele', 'Clos-Fiola 2', '2735' , 'Malleray', '0324922175' , '0764721754' , 'diblasio.michael@gmail.com', 2);
     
    INSERT INTO `groupeclients` (`NomGroupe`) VALUES
    ('Clients féminin'),
    ('Clients masculin'),
    ('Clients concours féminin'),
    ('Clients concours masculin'),
    ('Clients cours féminin');

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Pour commencer, assure toi que tes tables utilisent bien le moteur InnoDB sinon tes contraintes de clés étrangères sont tout bonnement ignorées par MySQL !

    J'ai fais un test en supprimant le groupe 1 de la table GroupeClients.
    Le tuple se supprime sans problème.

    Normalement il ne devrais pas se supprimer vu que dans ma table client j'ai un client qui a dans la colonne Ref_NumerosGroupe le tuple 1.

    J'ai demander a ma prof et elle me dis que c'est a caus e de la version et le sgbd ne prend pas en compte les contrainte.
    Ta prof et toi semblez comprendre les contraintes de clé étrangères à l'envers !

    Ta clé étrangère située dans la table des clients impose qu'à la création d'un client, la colonne Ref_NumerosGroupe ait une valeur existant déjà dans la colonne NumerosGroupe de la table GroupeClients.

    La table GroupeClient n'a pas de contrainte et on peut supprimer ses lignes sans problème !

    Si tu veux supprimer les clients du groupe lorsque tu supprimes un groupe, il faut ajouter à ta contrainte de clé étrangère la clause ON DELETE CASCADE.
    Mais faut-il vraiment supprimer un client ?
    Il est préférable d'autoriser la nullité de la clé étrangère et d'ajouter à la contrainte de clé étrangère la clause ON DELETE SET NULL. On peut ensuite agir sur les clients qui ont cette clé étrangère à NULL pour leur affecter un autre groupe ou décider de leur suppression effective.

    On peut aussi créer un trigger sur suppression d'un groupe qui n'autorisera cette suppression que s'il n'existe plus de clients appartenant à ce groupe.

    Pour plus d'infos sur les contraintes de clés étrangères, voir le cours de SQLPro "Contraintes SQL" à partir du chapitre 5..
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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é
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut
    ok je te remercie pour ces précisions je vais lire le cours

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

Discussions similaires

  1. Problème de contrainte sur une partie de date (l'année)
    Par shefla dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/04/2006, 21h50
  2. problème d'état suite à changement de version
    Par moicats dans le forum Access
    Réponses: 4
    Dernier message: 11/04/2006, 16h16
  3. [PHP-JS] Problème php-javascript (suite)
    Par nicoaix dans le forum Langage
    Réponses: 4
    Dernier message: 21/12/2005, 10h47
  4. Réponses: 5
    Dernier message: 26/10/2005, 14h43
  5. Problème de contrainte dans un "CREATE DOMAIN ..."
    Par VenusX117 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/02/2005, 18h06

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