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 :

Contrainte inopérante. Pourquoi ?


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut Contrainte inopérante. Pourquoi ?


    Voici mon MCD dont je parlais dans un autre sujet. Ici, j'ai un problème, je ne veux pas que l'utilisateur ait à saisir chaque jour dans la table jour. Je voudrais qu'une fois saisi dans Projet, le jour s'ajoute automatiquement dans la table associée.

    Comment faire ?

    Merci.
    Voir message 2.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    Bon, personne n'a l'air de savoir. Autre question :

    J'ai fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE xyz
    ADD CONSTRAINT constraintNom
     FOREIGN KEY (Utilisateur) REFERENCES Utilisateur(NumUtilisateur)
    La requête a bien fonctionné, et malgré tout en insérant un enregistrement dans xyz avec un NumUtilisateur inexistant, ça fonctionne.

    C'est assez louche o_O

  3. #3
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Pour votre premier probleme, vous pouvez toujours utiliser un trigger.
    Pour votre contrainte, effectivement c'est louche... Vous pouvez confirmer par une recherche dans vos tables system que la contrainte est bien active ?

    Bon courage

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Quel est le SGBD ?

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Par défaut
    es tu sur que ton champ (Utilisateur) est bien NOT NULL ?

  6. #6
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 243
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Votre discussion fait donc suite à celle-ci : mise en place de relations (par Zak Blayde)


    Citation Envoyé par Zak Blayde
    Je voudrais qu'une fois saisi dans Projet, le jour s'ajoute automatiquement dans la table associée.
    Supprimez la table Jour qui ne sert strictement à rien. En passant vous pouvez renommer xyz par exemple en Horaire.

    Vos CREATE TABLE doivent ressembler à cette ébauche :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE Utilisateur 
    (
        UtilisateurId    Integer       NOT NULL
      , UtilisateurNom   Varchar(30)   NOT NULL
     , PRIMARY KEY (UtilisateurId)
     ) ;
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE Projet 
    (
        ProjetId         Integer       NOT NULL
      , ProjetNom        Varchar(30)   NOT NULL
     , PRIMARY KEY (ProjetId)
     , UNIQUE (ProjetNom)
     ) ;
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE Horaire 
    (
        ProjetId         Integer   NOT NULL
      , UtilisateurId    Integer   NOT NULL
      , Jour             Integer   NOT NULL
      , NbHeures         Integer   NOT NULL
     , PRIMARY KEY (ProjetId, UtilisateurId, Jour)
     , FOREIGN KEY (ProjetId) REFERENCES Projet
     , FOREIGN KEY (UtilisateurId) REFERENCES Utilisateur
    )  ;

    L’attribut Jour est incorporé à la table Horaire et entre comme précédemment dans la composition de la clé primaire de la table.

    Comme le suggère Yanika_bzh, il y a des solutions pour incrémenter Jour automatiquement : les champions du SQL vous fourniront les solutions. Encore faudrait-il savoir si Jour repart à 1 en début de semaine, de décade, de mois, de trimestre, d’année, de siècle, jamais...

    Et si vous ne répondez pas à la question d’Antoun, les champions évoqués risquent de rester muets ou de fournir des solutions strictement et seulement conformes à la norme SQL.

    Par ailleurs, fournissez vos CREATE et ALTER TABLE complets : vos interlocuteurs ne lisent pas dans le marc de café. Voyez par exemple la question pertinente que boubaze est obligé de poser.


    Citation Envoyé par Zak Blayde
    personne n'a l'air de savoir
    Disons que les gens savent, mais ils ont aussi des occupations dans la journée. Et dans certains cas, ces occupations pourraient finir par les accaparer fort longtemps. Bref, mettez un minimum de forme.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Disons que les gens savent, mais ils ont aussi des occupations dans la journée. Et dans certains cas, ces occupations pourraient finir par les accaparer fort longtemps. Bref, mettez un minimum de forme.
    Oui désolé, ce n'est pas ce que je voulais dire.

    C'est un mySQL server intégré dans une solution LAMP (PHPmyAdmin).

    La semaine commence le lundi et finit le vendredi en l'occurrence.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    double post pour l'up, désolé.

    Voici mes requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE Projet
    (
    	ProjetId varchar(10) NOT NULL,
    	PRIMARY KEY (ProjetId)
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE Utilisateur
    (
    	UtilisateurId Integer NOT NULL,
    	UtilisateurNom varchar(30) NOT NULL,
    	PRIMARY KEY (UtilisateurId)
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE Horaire
    (
    	ProjetId varchar( 10 ) NOT NULL ,
    	UtilisateurId Integer NOT NULL ,
    	Jour Date NOT NULL ,
    	NbHeures Integer NOT NULL ,
    	PRIMARY KEY ( ProjetId, UtilisateurId, Jour ) ,
    	FOREIGN KEY ( ProjetId ) REFERENCES Projet (ProjetId),
    	FOREIGN KEY ( UtilisateurId ) REFERENCES Utilisateur (UtilisateurId)
    );

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Pour MySQL, il existe des conditions spécifiques pour qu'une contrainte d'intégrité référentielle existe :

    - les deux tables doivent être en InnoDB (vérifie le ENGINE= avec un SHOW CREATE TABLE)

    - les deux colonnes doivent être indexées (normalement, c'est fait automatiquement à la création de la contrainte)

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    Je n'ai pas encore créé les contraintes d'intégrité. J'ai un peu honte, mais j'ai oublié la syntaxe, et je ne trouve pas d'exemple (J'ai vraiment du mal avec les docs officielles, un exemple est toujours plus parlant). Je continue de chercher.

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Pas de honte à avoir. Tes contraintes sont déjà créées, par les FOREIGN KEY que tu as mis dans la définition des tables.

    Par contre, tu devrais citer la colonne référencée et pas seulement la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	FOREIGN KEY ( ProjetId ) REFERENCES Projet (ProjetId),
    	FOREIGN KEY ( UtilisateurId ) REFERENCES Utilisateur ( UtilisateurId )

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    J'ai modifié mais ça ne fonctionne toujours pas.
    Dans ma table système, je vois ça :


    Comment vérifier que tout est en InnoDB et que les index sont en place ?

    edit : apparemment, Horaire a UtilisateurId en index, tandis que Projet et Utilisateur n'en ont pas.

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Citation Envoyé par Zak Blayde Voir le message
    Comment vérifier que tout est en InnoDB
    vérifie le ENGINE= avec un SHOW CREATE TABLE

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    MyISAM !
    edit : Je suis passé en InnoDB. Le problème existe toujours. La contrainte d'intégrité ne fonctionne pas :'(

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    up.

    J'ai tenté de supprimer tout et de créer tout en InnoDB. Aucun changement, l'intégrité référentielle n'est pas en place.

    edit : L'ajout n'est pas automatique. En manuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE Horaire ADD CONSTRAINT FOREIGN KEY (ProjetId) REFERENCES Projet(ProjetId);
    ALTER TABLE Horaire ADD CONSTRAINT FOREIGN KEY (UtilisateurId) REFERENCES Utilisateur(UtilisateurId);


    Merci à tous.

  16. #16
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 243
    Billets dans le blog
    16
    Par défaut
    J'ai tenté de supprimer tout et de créer tout en InnoDB. Aucun changement, l'intégrité référentielle n'est pas en place.

    L'instruction :
    Set FOREIGN_KEY_CHECKS=0;
    n'est-elle pas active ?

    Selon l'image ci-dessous, l'intégrité est bien vérifiée :


  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    L'instruction :
    Set FOREIGN_KEY_CHECKS=0;
    n'est-elle pas active ?

    Selon l'image ci-dessous, l'intégrité est bien vérifiée :
    C'était probablement le problème. J'utiliserais ce paramètre la prochaine fois.

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

Discussions similaires

  1. Que choisir ? C# , VB.NET, C++, Delphi ? pourquoi ?
    Par Louis-Guillaume Morand dans le forum Général Dotnet
    Réponses: 475
    Dernier message: 08/04/2010, 19h27
  2. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  3. Pourquoi ces directives #ifndef ... en haut des .h
    Par Patrick PETIT dans le forum C
    Réponses: 8
    Dernier message: 06/03/2003, 23h53
  4. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56
  5. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44

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