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 :

Erreur #1005 sur clé étrangère et mise à jour en cascade (FOREIGN KEY / ON UPDATE CASCADE)


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2017
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 45
    Par défaut Erreur #1005 sur clé étrangère et mise à jour en cascade (FOREIGN KEY / ON UPDATE CASCADE)
    Bonjour,

    Je tente de créer une nouvelle table dans ma base de données. Cette table contiendra l'historique des modifications pour chacune des 4 tables principales :
    - Contenu
    - AccueilMedia
    - AccueilTelechargements
    - Actualites

    La table Historique doit reprendre l'identifiant de la table modifiée et l'écrire dans la colonne contenant la clé étrangère concernée (laissant les autres clés étrangères à NULL). Elle doit aussi écrire l'horodatage de cette mise à jour.

    Cela devrait donner quelque chose comme ça :
    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
     
    USE `update`;
     
    CREATE TABLE `Historique` (
      `idHistorique` int NOT null AUTO_INCREMENT,
      `AccueilMedia_id` int,
      `AccueilTelechargements_id` int,
      `Actualites_id` int,
      `Contenu_id` int,
      `date_modification` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`idHistorique`),
      FOREIGN KEY (`AccueilMedia_id`) REFERENCES `AccueilMedia` (`idAccueilMedia`) ON UPDATE CASCADE,
      FOREIGN KEY (`AccueilTelechargements_id`) REFERENCES `AccueilTelechargements` (`idAccueilTelechargements`) ON UPDATE CASCADE,
      FOREIGN KEY (`Actualites_id`) REFERENCES `Actualites` (`idActualites`) ON UPDATE CASCADE,
      FOREIGN KEY (`Contenu_id`) REFERENCES `Contenu` (`idContenu`) ON UPDATE CASCADE
        );
    Or, j'obtiens l'erreur suivante :
    MySQL said: Documentation
    #1005 - Can't create table 'update.Historique' (errno: 150)
    J'ai donc voulu alléger la création de ma table en vérifiant l'opération avec une seule clé étrangère à mettre à jour en automatique. Ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    USE `update`;
     
    CREATE TABLE `Historique_Contenu` (
      `idHistorique` int NOT null AUTO_INCREMENT,
      `Contenu_id` int NOT NULL,
      `date_modification` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`idHistorique`),
      FOREIGN KEY (`Contenu_id`) REFERENCES `Contenu` (`idContenu`) ON UPDATE CASCADE
        );
    Mais là encore l'erreur persiste :
    MySQL said: Documentation
    #1005 - Can't create table 'update.Historique_Contenu' (errno: 150)
    Comment faire ?
    Et peut-on créer plusieurs clés étrangères avec "ON UPDATE CASCADE" dans une seule table d'historique (pour plusieurs tables à historiser) ?
    Ou bien dois-je créer une table d'historique par table à historiser ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    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 633
    Billets dans le blog
    10
    Par défaut
    Bonsoir,

    Cette table historique, si elle ne doit vraiment contenir que l'horodatage de dernière mise à jour, n'a vraiment absolument aucun intérêt !
    Ajoutez simplement cette colonne d'horodatage (ou une col date + une col heure au choix) + une colonne user de modification dans chacune des tables concernées, c'est ce qui se pratique à peu près partout

    Sinon oui vous pouvez avoir plusieurs FK avec des contraintes de type "reference" dans une même table
    Assurez vous que table mère et fille sont sur le même moteur, que la colonne est de même type de part et d'autre et que vous avez bien créé un index sur la colonne

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2017
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 45
    Par défaut
    Merci de votre réponse.

    Ok, je vais regarder les éléments que vous m'indiquez car l'origine de l'erreur est sans doute là.

    Pour vous répondre sur mon besoin, j'avais indiqué dans mon post
    Cette table contiendra l'historique des modifications
    . J'étais bien parti sur une colonne par table mais en fait il faut conserver non pas l'historique de la dernière mise à jour mais l'historique de l'ensemble des mises à par table et pour chacune des entrées de table. On doit pouvoir savoir quand (date et heure) un élément de ces tables a été modifié.

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Salut à tous.

    Pour créer une clef étrangère, vous devez :

    1) la table mère doit être créé avant la table fille.

    2) vous devez mettre exactement la même déclarative dans la table mère que celle qui est en clef étrangère dans la table fille.
    Autrement dit, si vous avez dans la table mère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id integer unsigned not null auto_increment primary key,
    vous devez déclarer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    clef integer unsigned not null,
    CONSTRAINT `FK_MERE` FOREIGN KEY (`clef`) REFERENCES `mere` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    3) quand vous insérez une nouvelle clef étrangère, la valeur doit exister au préalable dans la table mère.

    4) attention aux mots réservés comme "update" qu vous utilisez en tant que nom de base de données.

    5) Pour déclarer une colonne de mise à jour, voici comment procéder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    `create_date`  TIMESTAMP(6)   DEFAULT current_timestamp(6),
    `update_date`  TIMESTAMP(6)   DEFAULT current_timestamp(6)   ON UPDATE CURRENT_TIMESTAMP(6),
    A l'insertion, 'create_date' et 'update_date' seront renseignées.
    Sur une mise-à-jour, seul la colonne 'update_date' sera modifée.
    Vous ne devez pas référencer ces deux colonnes lors d'une insertion ou modification, car c'est automatique.
    C'est exactement la même chose avec la colonne 'id' qui est auto incrémentée.

    @+

Discussions similaires

  1. [WD14] Erreur 1005 sur Combo
    Par buzz68180 dans le forum WinDev
    Réponses: 1
    Dernier message: 19/06/2009, 14h50
  2. Trigger sur une table et mise à jour
    Par fffonck dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/06/2009, 11h11
  3. Problème sur une requête de mise à jour entre 2 tables
    Par Throbb dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/03/2009, 14h43
  4. Clé étrangère automatiquement mise à jour ?
    Par Ralfman68 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/02/2007, 14h49
  5. [MySQL] erreur php sur un formulaire de mis à jour
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 34
    Dernier message: 06/04/2006, 13h39

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