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

PHP & Base de données Discussion :

Comment importer une table sans clé primaire unique ?


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, Webdesigner
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 109
    Par défaut Comment importer une table sans clé primaire unique ?
    Bonjour à tous et à toutes,

    (J'ai déjà posé ma question ici mais n'ayant eu qu'une seule réponse, qui ne résout pas mon problème, je la repose dans cette section qui est peut-être plus appropriée).

    J'administre une boutique en ligne qui tourne sous Prestashop.
    Je voudrais passer en Multiboutique (pour ceux qui connaissent).
    Avant de le faire "réellement", je fais des tests en local avec Wampserver et PHPMyAdmin.

    Pour faire ces tests, j'ai exporté certaines tables de ma boutique en ligne pour les importer en local.
    (A noter qu'au moment de l'export, j'ai coché Drop table et Vider la table)

    Problème, quand j'importe en local, j'ai un message d'erreur "#1068 - Plusieurs clefs primaires définies".
    En effet, (suite à la réponse que j'ai eue sur l'autre section du forum) j'ai remarqué que j'avais (au moins) une table avec deux colonnes avec plusieurs milliers de fois les mêmes valeurs dans les deux colonnes en question.
    Autant dire que dans cette table je n'ai pas de clé primaire unique.

    Ma question est : comment faire pour importer une table sans clé primaire unique ?

    Est-ce que je ne peux pas
    1. Importer la table dans un tableur comme Excel
    2. Créer une colonne qui s'incrémente (et qui servira de clé primaire unique)
    3. L'enregistrer
    4. Importer cette table modifiée dans PHPMyAdmin
    5. Supprimer cette colonne une fois la table importée ?

    A moins que je puisse "forcer" PHPMyAdmin à importer la table même s'il n'y a pas de clés primaires uniques ? Si oui, comment faire ?

    Enfin, (ce que je comprends pas, c'est) comment Prestashop peut créer des tables sans clés primaires uniques et surtout, sans que ça ne gène PHPMyAdmin ?

    Dernière question subsidiaire : pourquoi j'ai un message d'erreur quand j'importe quelques tables, alors que je n'en ai pas quand j'importe toute la BDD ?

    Je vous remercie par avance pour vos réponses.
    Bonne journée

  2. #2
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Apparemment, ce que tu appelles clé primaire unique, pour toi, ne peut être qu'un champs id autoincrémenté.
    FAUX !
    Pas forcément besoin d'un identifiant dans certains cas. Il se peut que la clé soit formée par plusieurs colonnes.
    Tu n'es pas obligé d'avoir un champs avec une incrémentation automatique dans chaque table, notamment dans le cas des tables de liaison par exemple.


    Je ne vois pas pourquoi PHPMyAdmin t'interdirait d'importer ta base.
    Il est possible que l'export ne soit pas correct et que les tables ne soient pas exportées dans le bon ordre.
    Il y a pas mal d'options lors de l'export d'une base mysql, il est possible que tu te sois empressé de lancer un export avec les options par défaut.
    Vérifie de ce côté là.

  3. #3
    Membre confirmé
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, Webdesigner
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 109
    Par défaut
    Merci pour ta réponse ma5t3r. J'en ai un peu plus appris sur les BDD.
    Au niveau des options, comme je disais dans mon message initial, j'ai coché "Drop table" et "Vider la table avant d'importer" (pour cette dernière option, je ne suis pas certain de son utilité si je drop la table, mais bon... Avec ça, il me semble avoir fait un export SANS avoir coché "Vider la table" et ça n'a pas mieux fonctionné au moment de l'import.)

    Sinon hier, j'ai réussi à importer quasiment toutes les tables que je voulais sans avoir besoin de faire de manip.
    En fait, plutôt que de faire un export/import de plusieurs tables en même temps, j'ai fait un export/import des tables une à une afin d'identifier la/les tables qui posaient problème.
    Au final, il n'y en a qu'une seule (toute petite) qui pose problème, sans que je sache pourquoi. Toutes les autres ont été importées sans problème.

    Voici le contenu du fichier SQL de la table qui pose problème à l'import :
    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
    -- phpMyAdmin SQL Dump
    -- version 4.4.13.1
    -- http://www.phpmyadmin.net
    --
    -- Client :  xxxxxx.mysql.db
    -- Généré le :  Lun 31 Juillet 2017 à 10:40
    -- Version du serveur :  5.6.34-log
    -- Version de PHP :  5.6.30
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
     
    --
    -- Base de données :  `xxxxxx`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `ps_product_supplier`
    --
     
    CREATE TABLE IF NOT EXISTS `ps_product_supplier` (
      `id_product_supplier` int(11) unsigned NOT NULL,
      `id_product` int(11) unsigned NOT NULL,
      `id_product_attribute` int(11) unsigned NOT NULL DEFAULT '0',
      `id_supplier` int(11) unsigned NOT NULL,
      `product_supplier_reference` varchar(32) DEFAULT NULL,
      `product_supplier_price_te` decimal(20,6) NOT NULL DEFAULT '0.000000',
      `id_currency` int(11) unsigned NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=294 DEFAULT CHARSET=utf8;
     
    --
    -- Vider la table avant d'insérer `ps_product_supplier`
    --
     
    TRUNCATE TABLE `ps_product_supplier`;
    --
    -- Contenu de la table `ps_product_supplier`
    --
     
    INSERT INTO `ps_product_supplier` (`id_product_supplier`, `id_product`, `id_product_attribute`, `id_supplier`, `product_supplier_reference`, `product_supplier_price_te`, `id_currency`) VALUES
    (260, 13, 0, 0, '87091b_1', '0.000000', 0),
    (261, 774, 0, 0, '', '0.000000', 0),
    (262, 775, 0, 0, '', '0.000000', 0),
    (292, 564, 0, 0, '', '0.000000', 0),
    (293, 565, 0, 0, '', '0.000000', 0);
     
    --
    -- Index pour les tables exportées
    --
     
    --
    -- Index pour la table `ps_product_supplier`
    --
    ALTER TABLE `ps_product_supplier`
      ADD PRIMARY KEY (`id_product_supplier`),
      ADD UNIQUE KEY `id_product` (`id_product`,`id_product_attribute`,`id_supplier`),
      ADD KEY `id_supplier` (`id_supplier`,`id_product`);
     
    --
    -- AUTO_INCREMENT pour les tables exportées
    --
     
    --
    -- AUTO_INCREMENT pour la table `ps_product_supplier`
    --
    ALTER TABLE `ps_product_supplier`
      MODIFY `id_product_supplier` int(11) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=294;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    Est-ce que vous comprenez pourquoi ça bugue ?
    Quelle(s) option(s) j'ai cochées (ou non) posent problème ?

  4. #4
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Est ce que tu as essayé de repartir de zéro ?
    Autrement dit, supprimer la base de destination et la recréer avec le script d'export.
    Vider la table avant importation n'est pas utile si la table est vide avant l'import. Mysql génère la commande TRUNCATE si demandé mais elle n'est pas utile dans tous les cas.
    Essaie d'exporter un fichier sql puis utilise l'import d'un fichier complet via l'interface PHPMyAdmin.

    En regardant la requête générée par le moteur mysql, on s'aperçoit que cette table ps_product_supplier est bizarrement foutue (en même temps, je ne sais pas ce qu'il y avait dans la tête de l'analyste pour créer cette structure de bdd).
    C'est étonnant que des clés étrangères soient à 0 (zéro) dans une table de liaison.
    Si c'était ma base, je n’intégrerais pas les données de cette table (mais il faut quand même créer la table) et je regarderais par la suite pour "rattacher" les articles (id_product => {13, 774, 775, 564, 565}) aux bons fournisseurs avec l'interface logicielle.
    Et le tour est joué.

  5. #5
    Membre confirmé
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, Webdesigner
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 109
    Par défaut
    ma5t3r encore merci pour ta réponse.
    En réalité, je n'ai pas besoin de cette table, si je ne l'importe pas, ce n'est pas grave du tout. Je ne sais même pas d'où elle sort, car je n'ai entré aucun fournisseur. Et si j'en avais entré, pourquoi je l'aurais fait pour ces 5 produits et pas pour tous ?
    Comme cette table ps_supplier provoquait une erreur, je voulais comprendre et apprendre pourquoi.
    Quand j'ai posé ma première question, je pensais que l'erreur venait d'autres tables où il n'y avait pas de clés primaires uniques, d'où ma question initiale.

    Voici l'intégralité du message d'erreur (même si je doute que ça fasse avancer le schmilblick) :
    Requête SQL :

    ALTER TABLE `prsts_product_supplier`
    ADD PRIMARY KEY (`id_product_supplier`),
    ADD UNIQUE KEY `id_product` (`id_product`,`id_product_attribute`,`id_supplier`),
    ADD KEY `id_supplier` (`id_supplier`,`id_product`)

    MySQL a répondu :
    #1068 - Plusieurs clefs primaires définies

  6. #6
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Il faut la créer quand même, même si elle est vide. Le système en a besoin :-)

  7. #7
    Membre confirmé
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, Webdesigner
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 109
    Par défaut
    Pas de souci, elle est déjà créé par Prestashop.
    Toutes les tables étaient déjà créées avant l'import car j'avais installé Prestashop en local. C'est pour ça que je demandais à PHPMyAdmin de vider la table avant d'importer.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/04/2009, 10h16
  2. Comment importer une table SQL sous Delphi ?
    Par Yeldra dans le forum Débuter
    Réponses: 3
    Dernier message: 28/10/2007, 10h37
  3. Comment créer une table sans être root?
    Par dahtah dans le forum Débuter
    Réponses: 4
    Dernier message: 14/09/2007, 19h42
  4. Mapper une table sans clé primaire
    Par rosros dans le forum Hibernate
    Réponses: 4
    Dernier message: 14/09/2006, 15h16
  5. [Hibernate] Mapper une table sans clé primaire
    Par neuromencien dans le forum Hibernate
    Réponses: 4
    Dernier message: 13/06/2006, 17h05

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