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 :

Problème d'insertion avec Auto Incrément


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2019
    Messages : 23
    Par défaut Problème d'insertion avec Auto Incrément
    Bonjour

    Voici mon problème

    J'ai un CMS, qui a été développé il y a plusieurs année tous fonctionner sans problème.
    Aujourd'hui je viens de changer de serveur avec un version mysql plus récente (Mysql 8.0).
    J'ai réinstallé le CMS sur ce nouveau serveur et la base de données s'est créer sans erreur.
    Par contre en utilisant ensuite le CMS, les insertions dans une table ne se font pas. La requête sql qui en résulte tente d'insert à chaque fois le même identifiant pour l'ensemble des lignes alors qu'un enregistrement existe déjà pour cet identifiant.
    Cet identifiant est pourtant bien déclaré comme Auto Increment

    Ci dessous un screen shot de la structure ma table

    Nom : product.jpg
Affichages : 792
Taille : 264,7 Ko

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    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 636
    Billets dans le blog
    10
    Par défaut
    Sans doute la valeur initiale de l'auto_increment a -t-elle été réinitialisée.
    Vérifiez la valeur du paramêtre auto_increment_offset

    Toute autre chose : la table affichée est ce qu'on appelle une "table obèse". Elle possède beaucoup trop de colonnes, c'est symptomatique d'une modélisation mal faite et la source de performances très dégradées (pléthore d'index, accès concurrents dégradés, problèmes d'intégrité...).

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2019
    Messages : 23
    Par défaut
    Effectifement j'ai un doute sur l auto increment

    Voici l'offset renseigné

    Nom : product2.jpg
Affichages : 773
Taille : 37,4 Ko


    Voici les lignes déjà existantes dans ma table

    Nom : product3.jpg
Affichages : 779
Taille : 38,1 Ko


    J'ai essayé de renseigné l'offset à 6, mais il revient à 5 à chaque fois malgres la confirmation de phpmyadmin quand j'enregistre.

    Devrait il bien être à 6 ?

    Merci de ton aide

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    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 636
    Billets dans le blog
    10
    Par défaut
    auto_increment_offset contient la prochaine valeur à insérer, mais le manuel de référence MySQL V8 mentionne cette bizarrerie :

    When the value of auto_increment_offset is greater than that of auto_increment_increment, the value of auto_increment_offset is ignored.
    Du coup il faut aussi vérifier la valeur de l'incrément (auto_increment_increment)

    cf. https://dev.mysql.com/doc/refman/8.0...crement_offset

  5. #5
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2019
    Messages : 23
    Par défaut
    Bonjour

    Quand je fait la commande

    SHOW VARIABLES LIKE 'auto_inc%';


    J'ai bien comment résultat

    +--------------------------+-------+
    | Variable_name | Value |
    +--------------------------+-------+
    | auto_increment_increment | 1 |
    | auto_increment_offset | 1 |
    +--------------------------+-------+

    les variables me semble correctes et correspond bien a ce qui est affiché dans la doc.

    as tu une idées de piste que je pourrai explorer ?

    Merci de ton aide

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Vous pouvez montrer le code SQL et éventuellement le code PHP ou autre qui se charge de cette insertion ?

  7. #7
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2019
    Messages : 23
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      $sqlCreate = "CREATE TABLE " . PREFIX . "PRODUCT (ID int(11) unsigned NOT NULL AUTO_INCREMENT, CATEGORY_ID int(11) unsigned NOT NULL default '0', OLD_CATEGORY_ID INT(11) UNSIGNED DEFAULT '0', TITLE varchar(255) NOT NULL default ' ', TITLE_CLEAN varchar(255) NOT NULL default ' ', FILENAME VARCHAR(255) DEFAULT ' ', PAGE_TITLE VARCHAR(100), PAGE_KEYWORDS VARCHAR(100), PAGE_DESCRIPTION TEXT, KEYWORDS varchar(255) default NULL, IGNORE_KEYWORDS varchar(255) default NULL, MANUFACTURER INT(11) UNSIGNED NOT NULL default '0', MANUFACTURER_CODE VARCHAR(100) DEFAULT '', EAN_UPC VARCHAR(100) DEFAULT '', MIN_PRICE DECIMAL(9,2) DEFAULT '0.00', MAX_PRICE DECIMAL(9,2) DEFAULT '0.00', STORE_COUNT INT(11) UNSIGNED DEFAULT '0', ISVALID enum('Y','N') NOT NULL default 'Y', STANDBY tinyint(1) unsigned NOT NULL default 0, SPECIAL_OFFER enum('Y','N') NOT NULL default 'N', PRODUCT_RATING tinyint(3) NOT NULL default '-1', CLICKS INT(11) UNSIGNED NOT NULL default '0', FIELD_1 VARCHAR(255), FIELD_2 VARCHAR(50), FIELD_3 VARCHAR(50), FIELD_4 VARCHAR(50), FIELD_5 VARCHAR(50), FIELD_6 VARCHAR(50), FIELD_7 VARCHAR(50), FIELD_8 VARCHAR(50), FIELD_9 VARCHAR(50), DATE_ADDED datetime NOT NULL default '0000-00-00 00:00:00', ADDED_FROM_TYPE char(1) NULL default '', ADDED_FROM_REF varchar(100) NULL default '', ADDED_FROM_CATMAP int(11) NULL default 0, LAST_UPDATED DATETIME, FEATURES_SELECTED ENUM('Y','N')  DEFAULT 'N' NOT NULL, CJ_ID VARCHAR(20) NOT NULL default '', AMAZON_ASIN VARCHAR(50), AFFWIN_ID varchar(20) NOT NULL default '', AMAZON_ID VARCHAR(15) DEFAULT '' NOT NULL, ICECAT_CATEGORY_ID INT(11) UNSIGNED NOT NULL DEFAULT 0, ICECAT_ID INT(11) UNSIGNED NOT NULL DEFAULT 0, KELKOO_ID VARCHAR(50) DEFAULT '', KELKOO_CATEGORY_ID VARCHAR(15) DEFAULT '', PRIMARY KEY (ID), INDEX IndexCATEGORY_ID (CATEGORY_ID), INDEX IndexFILENAME (FILENAME), INDEX IndexMANUFACTURER (MANUFACTURER), INDEX IndexMANUFACTURER_CODE (MANUFACTURER_CODE), INDEX IndexEAN_UPC (EAN_UPC), INDEX IndexISVALID (ISVALID), INDEX IndexSPECIAL_OFFER (SPECIAL_OFFER), INDEX IndexPRODUCT_RATING (PRODUCT_RATING), INDEX IndexCLICKS (CLICKS), INDEX IndexTITLE (TITLE), INDEX IndexTITLE_CLEAN (TITLE_CLEAN), INDEX IndexCOMP1(ID, ISVALID), INDEX IndexORDER_BY (CATEGORY_ID, ISVALID, STORE_COUNT), INDEX IndexTOTAL (CATEGORY_ID, ISVALID), INDEX IndexPROFILING (CATEGORY_ID, ID), INDEX IndexAFFWIN_ID(AFFWIN_ID), KEY IndexICECAT_CATEGORY_ID(ICECAT_CATEGORY_ID), KEY IndexICECAT_ID(ICECAT_ID), KEY IndexKELKOO_ID(KELKOO_ID), KEY IndexKELKOO_CATEGORY_ID(KELKOO_CATEGORY_ID), FOREIGN KEY(CATEGORY_ID) REFERENCES " . PREFIX . "CATEGORY(ID) ON DELETE CASCADE ) ENGINE=InnoDB " . DEFINE_DEFAULT_CHARSET;
            $sqlResult = executeUpdate($sqlCreate);
            if (!$sqlResult) {
                echo "<p>Could not create table " . PREFIX . "PRODUCT</p>";
            } else {
                echo "<p>Successfully created table " . PREFIX . "PRODUCT</p>";
            }
            executeUpdate("INSERT INTO " . PREFIX . "PRODUCT(ID, CATEGORY_ID, TITLE, ISVALID) VALUES(1, 1, 'Store base url redirect recording', 'N')");
            executeUpdate("INSERT INTO " . PREFIX . "PRODUCT(ID, CATEGORY_ID, TITLE, ISVALID) VALUES(2, 1, 'eBay default product for click recording', 'N')");

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Mais donc pourquoi ce code cherche-t-il à insérer manuellement des valeurs (1 et puis 2) pour la colonne ID qui est autoincrement ?
    Ça peut marcher la première fois, mais les exécutions successives sont vouées à l'échec.

  9. #9
    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 917
    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 917
    Par défaut
    Salut à tous.

    Vous avez cinq lignes dans votre table et la valeur de l'auto incrément est à "5".
    Normalement, la valeur devrait être à "6" et non à "5".

    La prochaine valeur à insérer dans votre table, ne doit pas exiter aupréalable dans votre colonne.

    Pour réparer cette bévue, faites un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table `pc7_produkt` auto_increment = 6;
    Puisque cette colonne "id" est gérée par MySql, vous ne devez pas la spécifier dans vos insertions.

    Cordialement.
    Artemus24.
    @+

  10. #10
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2019
    Messages : 23
    Par défaut
    Artemus,

    J'ai bien fait ce que tu me dis mais la valeur reste à 5, elle ne passe pas à 6.

    Donc impossible d’insérer d'autres lignes

    As-tu une autre idée sur ce problème

    Cordialement

  11. #11
    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 917
    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 917
    Par défaut
    Salut NickyBee.

    Celui qui a créé la table n'a aucun connaissance ce qu'est le modèle relationnel.
    Comme l'indique Escartefigue, la description de votre table est obèse pour reprendre son expression.
    Ne serait-ce pas un fichier séquentiel que vous désirez charger ?

    Votre énorme table peut être découpée en plusieurs autres petites tables que l'on peut mettre en relation.
    La répétition de la colonne "field" montre que vous ne savez pas à quoi sert une base de données.
    Dans la plupart des cas, ces colonnes ne sont pas renseignées ou à marquées à NULL.
    Vous avez une mauvaise gestion de votre espace de stockage.

    Vous avez vingt index. Il y en a de trop. Et en plus, on ne sait pas à quoi sert votre table.

    Je ne vois pas l'intérêt de créer une table dans un script SQL, comme vous le faites.
    Si vous avez des noms de tables différents, mais toujours la même structure, il y a un astuce fort simple.
    Il suffit de créer une table modèle dans votre base de données.
    Puis ensuite de procéder ainsi :
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    create table `un_autre_nom` like `votre_table_modèle`;
    Citation Envoyé par NickyBee
    As tu une autre idée sur ce problème
    Le problème vient de la colonne "id" qui est auto incrémenté.
    Vous ne devez pas faire apparaitre dans vos insertions la colonne "id" comme vous le faites.
    Laissez Mysql gérer cette colonne auto incrémentée.

    Nous ne voyons que les deux premières lignes que vous insérez. Comment insérez vous les autres lignes ?

    Cordialement.
    Artemus24.
    @+

  12. #12
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2019
    Messages : 23
    Par défaut
    Citation Envoyé par Artemus24 Voir le message

    Nous ne voyons que les deux premières lignes que vous insérez. Comment insérez vous les autres lignes ?

    Cordialement.
    Artemus24.
    @+

    La mise à jour et l'import ce fait via un fichier CSV en lançant un cronjob.

    Voici ci dessous une partie code php
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    		$arr = array(
    						'ID'				=> $productId,
    						'CATEGORY_ID'		=> $category,
    						'TITLE'				=> $name,
    						'TITLE_CLEAN'		=> $nameClean,
    						'FILENAME'			=> $filename,
    						'MANUFACTURER'		=> $manufacturerId,
    						'MANUFACTURER_CODE'	=> $manufacturerCode,
    						'EAN_UPC'			=> $eanUpc[0],
    						'MIN_PRICE'			=> $minPrice,
    						'MAX_PRICE'			=> $maxPrice,
    						'STORE_COUNT'		=> $storeCount,
    						'ISVALID'			=> $isValid,
    						'STANDBY'			=> $standby,
    						'SPECIAL_OFFER'		=> $specialOffer,
    						'PAGE_TITLE'		=> $pageTitle,
    						'PAGE_KEYWORDS'		=> $pageKeywords,
    						'PAGE_DESCRIPTION'	=> $pageDescription,
    						'FIELD_1'			=> $field1,
    						'FIELD_2'			=> $field2,
    						'FIELD_3'			=> $field3,
    						'FIELD_4'			=> $field4,
    						'FIELD_5'			=> $field5,
    						'FIELD_6'			=> $field6,
    						'FIELD_7'			=> $field7,
    						'FIELD_8'			=> $field8,
    						'FIELD_9'			=> $field9
    					);
     
    		foreach ( $exVars as $key => $val )
    			$arr[$key] = $val;
     
    		$arr['DATE_ADDED']			= getTimezoneTime();
    		$arr['ADDED_FROM_TYPE']		= $addFromSrc;
    		$arr['ADDED_FROM_REF']		= $addFromRef;
    		$arr['ADDED_FROM_CATMAP']	= $addFromCM;
     
    		$res = tableInsert('PRODUCT', $arr);
     
    		if ( $res > 0 )
    		{
    			$msg	= 2;
    			$msgEx	= '';
     
    			tableInsert('PRODUCT_DETAIL', array(
    												'PRODUCT_ID'	=> $productId,
    												'DETAIL'		=> $detail
    											));
     
    			makeProductImagePath($msgEx, $productId, $category);
     
    			addProductCode($msgEx, $productId, $manufacturerCode, $manufacturerId);
     
    			// Update Product EAN/UPC
    			addProductEAN($msgEx, $productId, $eanUpc);
     
    			// Update product keywords
    			$karr = getCleanedWordsFromString($exVars['KEYWORDS']);
    			$ktot = count($karr);
    			if ( $ktot > 0 )
    			{
    				$sqlVals = '';
    				foreach ( $karr as $val )
    					$sqlVals .= ",('".$productId."', '".handleSingleQuote($val)."', '".$ktot."')";
     
    				executeUpdate("INSERT INTO ".PREFIX."PRODUCT_KEYWORDS_MAP(PRODUCT_ID, KEYWORD, TOT_KWDS) VALUES".substr($sqlVals, 1));
    			}
     
    			// Update product ignore-keywords
    			$karr = getCleanedWordsFromString($exVars['IGNORE_KEYWORDS']);
    			if ( count($karr) > 0 )
    			{
    				$sqlVals = '';
    				foreach ( $karr as $val )
    					$sqlVals .= ",('".$productId."', '".handleSingleQuote($val)."')";
     
    				executeUpdate("INSERT INTO ".PREFIX."PRODUCT_IGNORE_KEYWORDS_MAP(PRODUCT_ID, KEYWORD) VALUES".substr($sqlVals, 1));
    			}
     
    			return $productId;
    		}
    		else
    		{
    			$msg = 6;
    			return 0;
    		}
    	}
     
    //*************************************************************************************************
     
    	function updateProduct(&$msg, $productId, $category, $name, $filename, $detail, $manufacturer='', $manufacturerCode='', $isValid='', $specialOffer='', $field1='', $field2='', $field3='', $field4='', $field5='', $field6='', $field7='', $field8='', $field9='', $minPrice='', $maxPrice='', $storeCount='', $isUpdateAll=0, $eanUpc='', $exVars='')
    	{
    		global $pageTitle, $pageKeywords, $pageDescription;
     
    		$msgEx				= '';
     
    		$exVars				= is_array($exVars) ? $exVars : array();
     
    		if ( !is_array($eanUpc) )
    		{
    			$eanUpc	= trim($eanUpc);
    			$eanUpc	= $eanUpc == '' ? array() : array($eanUpc);
    		}
     
    		if ( $productId == '' )
    		{
    			$msg = 105;
    			return 0;
    		}
     
    		if ( $isUpdateAll == 1 )
    		{
    			if ( $name == '' )
    			{
    				$msg = 136;
    				return 0;
    			}
     
    			if ( $category == '' )
    			{
    				$msg = 134;
    				return 0;
    			}
    		}
    Cordialement
    Nicky

Discussions similaires

  1. Requête insert multiple avec auto-incrément
    Par glupglup dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/01/2017, 12h30
  2. Problème d'insertion avec un champ Date/Heure ?
    Par bds2006 dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/06/2006, 10h37
  3. Problème d'INSERT avec caractères accentués: mysql 5.0
    Par yizashi dans le forum Installation
    Réponses: 2
    Dernier message: 05/04/2006, 10h26
  4. Compactage de tables Paradox avec auto-incrément
    Par Unusual_FL dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/09/2004, 15h05
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

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