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 :

Les contraintes d' intégrité ne fonctionnent pas : clé étrangère


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2023
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Les contraintes d' intégrité ne fonctionnent pas : clé étrangère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vehicule | CREATE TABLE `vehicule` (
      `codeve` int(11) NOT NULL AUTO_INCREMENT,
      `immat1` varchar(50) DEFAULT NULL,
      `immat2` varchar(50) DEFAULT NULL,
      `codety` int(11) DEFAULT NULL,
      PRIMARY KEY (`codeve`),
      KEY `fk_type_vehicule` (`codety`)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type  | CREATE TABLE `type` (
      `codety` int(11) NOT NULL AUTO_INCREMENT,
      `nomty` varchar(50) DEFAULT NULL,
      `capacitety` float DEFAULT NULL,
      PRIMARY KEY (`codety`)
    je constate que la contrainte d' intégrité ne fonctionne pas car lorsque j' enregistre des donnés dans véhicule même si la clé étrangère "codety" n' a pas de correspondance j' assiste à une insertion reussite.
    Merci d' avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 215
    Points : 12 810
    Points
    12 810
    Par défaut
    bonjour,
    Je ne vois pas de déclaration de contrainte dans le code que tu nous montres.
    Il n'y a pas de référence à la table "type" dans la déclaration de la table "vehicule".
    Tu peux voir la syntaxe des clés étrangères .

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 189
    Points : 39 085
    Points
    39 085
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Vérifiez d'abord que vous utilisez bien le moteur INNODB, en effet, MYISAM accepte les éléments du DDL liés aux contraintes d'intégrité, mais ne les utilise pas (il les traite comme des commentaires )

    Ensuite, il faut créer la table référencée avant la table référençante. Ainsi, la table des types doit être créée avant la table des véhicules.

    Enfin, pour mettre en oeuvre la contrainte, il faut la décrire de cette façon (exemple) :

    FOREIGN KEY (codety) REFERENCES type(codety)...
    En ajoutant si souhaité les instructions ON DELETE et ON UPDATE

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 388
    Points : 19 119
    Points
    19 119
    Par défaut
    Salut à tous.

    Voici un exemple :
    Code mysql : 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
    --------------
    START TRANSACTION
    --------------
    
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
    
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
    
    --------------
    DROP TABLE IF EXISTS `type`
    --------------
    
    --------------
    CREATE TABLE `type`
    ( `codety`     integer unsigned NOT NULL primary key,
      `nomty`      varchar(255)     NOT NULL,
      `capacitety` decimal(15,2)    NOT NULL DEFAULT 0
    ) ENGINE=Innodb
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
    
    --------------
    insert into `type` (`codety`,`nomty`,`capacitety`) values
     (25,'exemple',17.45)
    --------------
    
    --------------
    select * from `type`
    --------------
    
    +--------+---------+------------+
    | codety | nomty   | capacitety |
    +--------+---------+------------+
    |     25 | exemple |      17.45 |
    +--------+---------+------------+
    --------------
    DROP TABLE IF EXISTS `vehicule`
    --------------
    
    --------------
    CREATE TABLE `vehicule`
    ( `codeve`   integer unsigned NOT NULL,
      `immatve`  varchar(255)     NOT NULL,
      `codety`   integer unsigned NOT NULL,
      CONSTRAINT `FK_01` FOREIGN KEY (`codety`) REFERENCES `type` (`codety`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=Innodb
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
    
    --------------
    insert into `vehicule` (`codeve`,`immatve`,`codety`) values (75,'123-abc-456',25)
    --------------
    
    --------------
    insert into `vehicule` (`codeve`,`immatve`,`codety`) values (17,'987-xyz-321',49)
    --------------
    
    ERROR 1452 (23000) at line 63 in file: 'E:\base.sql': Cannot add or update a child row: a foreign key constraint fails (`base`.`vehicule`, CONSTRAINT `FK_01` FOREIGN KEY (`codety`) REFERENCES `type` (`codety`) ON DELETE CA
    SCADE ON UPDATE CASCADE)
    --------------
    select * from `vehicule`
    --------------
    
    +--------+-------------+--------+
    | codeve | immatve     | codety |
    +--------+-------------+--------+
    |     75 | 123-abc-456 |     25 |
    +--------+-------------+--------+
    --------------
    select     a.codeve,
               a.immatve,
               b.codety,
               b.nomty,
               b.capacitety
    
          from `vehicule` as a
    
    inner join `type`     as b
            on  b.codety = a.codety
    --------------
    
    +--------+-------------+--------+---------+------------+
    | codeve | immatve     | codety | nomty   | capacitety |
    +--------+-------------+--------+---------+------------+
    |     75 | 123-abc-456 |     25 | exemple |      17.45 |
    +--------+-------------+--------+---------+------------+
    --------------
    COMMIT
    --------------
    
    Appuyez sur une touche pour continuer...
    Comme on peut le constater, la seconde insertion est rejetée car la valeur de la colonne "codety" n'est pas présente dans la table "type".

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2023
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup à tous .Le probleme etait au niveau de mon moteur de recherche il etait sur myisam je lui est attribué innodb. j' ai voulu mettre la valeur par default du moteur sur innodb j ai pas reuusi.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2023
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    j' avais pas de donné internet c est la cause de mon retard pour le message une fois encore merci.

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 157
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 157
    Points : 8 335
    Points
    8 335
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Affouda Voir le message
    Merci beaucoup à tous .Le probleme etait au niveau de mon moteur de recherche il etait sur myisam je lui est attribué innodb. j' ai voulu mettre la valeur par default du moteur sur innodb j ai pas reuusi.
    Pour définir le moteur de table par défaut => https://dev.mysql.com/doc/refman/8.0...storage_engine
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2023
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Merci c est top

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

Discussions similaires

  1. [WD9] Contrainte d'intégrité ne fonctionne pas
    Par mbayvos dans le forum WinDev
    Réponses: 1
    Dernier message: 19/05/2008, 11h20
  2. Réponses: 6
    Dernier message: 22/05/2007, 09h55
  3. Réponses: 1
    Dernier message: 13/05/2007, 16h25
  4. Question sur les contraintes d'intégrités
    Par eGGyyS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/04/2004, 13h51

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