PHP probleme pour generer une clé primaire
Résolu/Fermé
A voir également:
- PHP probleme pour generer une clé primaire
- Clé windows 10 gratuit - Guide
- Cle usb non reconnu - Guide
- Clé bootable windows 10 - Guide
- Comment générer un qr code - Guide
- Recuperer cle windows - Guide
6 réponses
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
19 mars 2008 à 10:38
19 mars 2008 à 10:38
Bonjour,
Essaie de faire quelque chose de ce genre (peut ne pas fonctionner si tu as une vieille version de mysql)
Si j'appelle id ta clé primaire, et en supposant que ce soit le premier champ de ta table, modifie ta requête insert de la façon suivante :
INSERT INTO table VALUES ((SELECT MAX(id) + 1 FROM table), valeur1, valeur2, ...)
C'est la méthode qui permet de rapprocher au maximum le calcul de l'id et la requête d'insertion.
Toutefois, MySQL n'étant pas ACID suivant le format de base que tu utilises (InnoDB l'est, MyISAM ne l'est pas), il y a toujours un risque que deux utilisateurs fassent la requête « en même temps », et que la base de données s'emmêle les pinceaux. La conséquence ne serait pas trop grave : la 2e requête ne passerait pas. Et de toutes façons, à moins d'avoir une forte fréquentation de ton site, les risques sont extrêmement faibles.
Xavier
Essaie de faire quelque chose de ce genre (peut ne pas fonctionner si tu as une vieille version de mysql)
Si j'appelle id ta clé primaire, et en supposant que ce soit le premier champ de ta table, modifie ta requête insert de la façon suivante :
INSERT INTO table VALUES ((SELECT MAX(id) + 1 FROM table), valeur1, valeur2, ...)
C'est la méthode qui permet de rapprocher au maximum le calcul de l'id et la requête d'insertion.
Toutefois, MySQL n'étant pas ACID suivant le format de base que tu utilises (InnoDB l'est, MyISAM ne l'est pas), il y a toujours un risque que deux utilisateurs fassent la requête « en même temps », et que la base de données s'emmêle les pinceaux. La conséquence ne serait pas trop grave : la 2e requête ne passerait pas. Et de toutes façons, à moins d'avoir une forte fréquentation de ton site, les risques sont extrêmement faibles.
Xavier
croy
Messages postés
453
Date d'inscription
samedi 19 janvier 2008
Statut
Membre
Dernière intervention
23 octobre 2012
114
19 mars 2008 à 10:38
19 mars 2008 à 10:38
Pour faire cela :
1.quand tu crées ta table
Lorsque tu fais un INSERT, ne pas préciser le champ id qui sera incrémenté automatiquement par mysql.
1.quand tu crées ta table
CREATE TABLE laTable ( `id` int(11) NOT NULL auto_increment, etc..., `actif` int(1) default '1', UNIQUE KEY `id` (`id`) );
Lorsque tu fais un INSERT, ne pas préciser le champ id qui sera incrémenté automatiquement par mysql.
IdleMan
Messages postés
243
Date d'inscription
jeudi 17 janvier 2008
Statut
Membre
Dernière intervention
25 juin 2012
60
19 mars 2008 à 10:40
19 mars 2008 à 10:40
Evite de poster a la fois dans la section programmation et webmastering , tu risque d'ecraser inutilement des messages d'autres utilisateurs qui ont eux aussi des questions .
Pour ce qui est de ton probleme SQL le fait directement lors de la creation de ta table , il faut taper le code suivant quand tu créé ta table :
CREATE TABLE blabla (
id INT NOT NULL AUTO_INCREMENT ,
champ1 VARCHAR( 225 ) NOT NULL ,
PRIMARY KEY ( id )
)
Pour ce qui est de ton probleme SQL le fait directement lors de la creation de ta table , il faut taper le code suivant quand tu créé ta table :
CREATE TABLE blabla (
id INT NOT NULL AUTO_INCREMENT ,
champ1 VARCHAR( 225 ) NOT NULL ,
PRIMARY KEY ( id )
)
Merci pour vos messages.
J'utilise MySQL 4.1 et mes bases de données sont de type MyISAM
Donc je ne sais pas si le INSERT INTO table VALUES ((SELECT MAX(id) + 1 FROM table), valeur1, valeur2, ...) va marcher!!
Pour plusieurs raisons, dans matable, je ne peux pas utiliser de clé primaire incrémentée automatiquement!!!
Merci pour votre aide
Flipmode
PS: Désolè d'avoir poster mon post dans la rubrique programmation et webmastering mais je ne savais pas ou le poster
J'utilise MySQL 4.1 et mes bases de données sont de type MyISAM
Donc je ne sais pas si le INSERT INTO table VALUES ((SELECT MAX(id) + 1 FROM table), valeur1, valeur2, ...) va marcher!!
Pour plusieurs raisons, dans matable, je ne peux pas utiliser de clé primaire incrémentée automatiquement!!!
Merci pour votre aide
Flipmode
PS: Désolè d'avoir poster mon post dans la rubrique programmation et webmastering mais je ne savais pas ou le poster
croy
Messages postés
453
Date d'inscription
samedi 19 janvier 2008
Statut
Membre
Dernière intervention
23 octobre 2012
114
19 mars 2008 à 11:11
19 mars 2008 à 11:11
Les requêtes multiples ne fonctionnent pas avec mySQL.
A ma connaissance, tu n'as pas d'autre solution que de faire 2 requêtes :
1. un select pour récupérer le dernier id alloué :
2. l'INSERT pour ... insérer avec lavaleur récupérée +1 (attention aux accès simultanés)
A ma connaissance, tu n'as pas d'autre solution que de faire 2 requêtes :
1. un select pour récupérer le dernier id alloué :
SELECT id FROM table ORDR BY id DESC LIMIT 1
2. l'INSERT pour ... insérer avec lavaleur récupérée +1 (attention aux accès simultanés)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci pour ta réponse
Tu as raison j'ai teste le INSERT INTO table VALUES ((SELECT MAX(id) + 1 FROM table), valeur1, valeur2, ...) et ça ne marche pas donc je vais devoir faire ça en 2 requêtes
Mais je galère un peu :
$sql = "SELECT int_product_id FROM tb_product ORDR BY int_product_id DESC LIMIT 1";
$result_sql = mysql_query($sql);
$row = mysql_fetch_array($result_sql);
$max_id = $row[0];
$add = "INSERT INTO tb_product (int_product_id,var_product_name,) VALUES ('$max_id + 1','$name')";
....
Il m'insère bien une nouvelle ligne dans ma table mais avec l'id=0 :(
Toutes les nouvelles lignes que j'insere ont int_product_id=0
Le $max_id + 1 dans ma requete SQL ne marche pas!
J'ai essaye de faire $max_id = $row[0] +1; mais toutes les nouvelles lignes ont int_product_id=1
Merci pour ton aide
Flipmode
Tu as raison j'ai teste le INSERT INTO table VALUES ((SELECT MAX(id) + 1 FROM table), valeur1, valeur2, ...) et ça ne marche pas donc je vais devoir faire ça en 2 requêtes
Mais je galère un peu :
$sql = "SELECT int_product_id FROM tb_product ORDR BY int_product_id DESC LIMIT 1";
$result_sql = mysql_query($sql);
$row = mysql_fetch_array($result_sql);
$max_id = $row[0];
$add = "INSERT INTO tb_product (int_product_id,var_product_name,) VALUES ('$max_id + 1','$name')";
....
Il m'insère bien une nouvelle ligne dans ma table mais avec l'id=0 :(
Toutes les nouvelles lignes que j'insere ont int_product_id=0
Le $max_id + 1 dans ma requete SQL ne marche pas!
J'ai essaye de faire $max_id = $row[0] +1; mais toutes les nouvelles lignes ont int_product_id=1
Merci pour ton aide
Flipmode
Mon problème est résolu :)
Voici le code que j'ai utilisé:
$query = "SELECT MAX(int_product_id) FROM tb_product";
$result = mysql_query($query) or die ("Exécution de la requête impossible");
$row = mysql_fetch_row($result);
$max_id = $row[0] + 1;
$add = "INSERT INTO tb_product (int_product_id,var_product_name,) VALUES ('$max_id','$name')";
Flipmode
Voici le code que j'ai utilisé:
$query = "SELECT MAX(int_product_id) FROM tb_product";
$result = mysql_query($query) or die ("Exécution de la requête impossible");
$row = mysql_fetch_row($result);
$max_id = $row[0] + 1;
$add = "INSERT INTO tb_product (int_product_id,var_product_name,) VALUES ('$max_id','$name')";
Flipmode