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 & foreign key


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Par défaut contrainte & foreign key
    Bonjour,

    je me lance dans MySQL, et je souhaiterai savoir s'il est possible à partir d'une table, d'avoir 2 clés étrangères qui pointent vers une même table.

    Les 2 tables :
    • Table parent : Customer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `customer` (
      `No.` varchar(20) NOT NULL,
      `Name` text,
      PRIMARY KEY (`No.`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    • Table Enfant : Ecritures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `ecriture_client` (
      `Entry No.` int(11) NOT NULL,
      `customer_no.` varchar(20) DEFAULT NULL,
      `posting_date` date DEFAULT NULL,
      `Sell-to Customer No.` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`Entry No.`),
      KEY `customer_no.` (`customer_no.`),
      KEY `Sell-to Customer No.` (`Sell-to Customer No.`),
      CONSTRAINT `ecriture_client_fk2` FOREIGN KEY (`Sell-to Customer No.`) REFERENCES `customer` (`No.`) ON DELETE CASCADE,
      CONSTRAINT `ecriture_client_fk1` FOREIGN KEY (`customer_no.`) REFERENCES `customer` (`No.`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    J'ai bien entendu fait le test qui me retourne un message d'erreur.

  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
    La réponse à la question est oui.

    Quel est le message d'erreur ?

    Au passage, une clé primaire en VARCHAR(20), et par voie de conséquence les clés étrangères qui y font référénce, c'est pas top !
    Voir ce qu'est une bonne clé.
    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 averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Par défaut
    Le message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot add or update a child row: a foreign key constraint fails (`report`.`ecriture_client`, CONSTRAINT `ecriture_client_fk2` FOREIGN KEY (`Sell-to Customer No.`) REFERENCES `customer` (`No.`) ON DELETE CASCADE)
    Concernant ma clé en VARCHAR(20), je n'ai pas trop le choix. Il s'agit d'une base dédiée au statistiques et la base d'origine contient des numéros clients avec des caractères alpha-numériques et non uniquement numériques.

  4. #4
    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
    Bien entendu, la table parent est créée avant la table fille ?

    Et ce message d'erreur intervient bien à la création de la table ?

    Concernant ma clé en VARCHAR(20), je n'ai pas trop le choix. Il s'agit d'une base dédiée au statistiques et la base d'origine contient des numéros clients avec des caractères alpha-numériques et non uniquement numériques.
    Rien n'empêche d'y ajouter une clé primaire entière et auto-incrémentée. Enfin bon...

    Autre chose : vu qu'il y a des points et des espaces dans tes noms de colonnes, tu seras obligé de toujours écrire celles-ci entourées d'apostrophes inversées ` dans tes requêtes. C'est le cas bien sûr quand la requête de création de table estsoumise au SGBD ?

    Sinon utilise phpMyAdmin et fait les relations à la souris.
    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 !

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Par défaut
    Dans l'ordre :

    Je n'ai pas eu de message lors la création des tables. J'ai d'abord créé les tables, puis j'ai ajouté les FK.

    C'est lors de l'insertion d'une ligne que j'ai ce message.

    Concernant la PK, qu'elle serait mes gains si je rajoute une clé primaire au lieu de celle que j'utilise ?

    Concernant les noms, je vais faire les modifications (merci).

  6. #6
    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
    Citation Envoyé par -Sylvain- Voir le message
    Je n'ai pas eu de message lors la création des tables. J'ai d'abord créé les tables, puis j'ai ajouté les FK.
    Et donc tu n'as pas eu d'erreur à la création des FK ?

    C'est lors de l'insertion d'une ligne que j'ai ce message.
    C'est bien ce qu'il me semblait !
    Le message est clair : Il faut que la valeur de `ecriture_client`.`Sell-to Customer No` existe dans la colonne de référence `customer`.`No`.
    (Putain que c'est chiant ces apostrophes inversées ! )

    Concernant la PK, qu'elle serait mes gains si je rajoute une clé primaire au lieu de celle que j'utilise ?
    C'est expliqué dans l'article de SQLPro dont j'ai mis le lien dans un précédent message. Les traitements sur les entiers sont beaucoup plus rapides que sur un VARCHAR(20). Donc les jointures avec clés étrangères sont plus rapides.
    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 !

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

Discussions similaires

  1. Erreur: conflit avec la contrainte FOREIGN KEY SAME TABLE
    Par useretl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/10/2007, 12h27
  2. Contrainte, Foreign Key et erreur SQL
    Par zevince dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 12/10/2007, 17h50
  3. Réponses: 3
    Dernier message: 13/07/2007, 09h32
  4. [Conception] problème avec la contrainte d'integrité foreign key
    Par zana74 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/08/2006, 20h42
  5. Ajout contrainte FOREIGN KEY
    Par loukili81 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 22/03/2006, 22h49

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