PHP probleme pour generer une clé primaire

Résolu/Fermé
Flipmode - 19 mars 2008 à 10:27
 Flipmode - 19 mars 2008 à 12:05
Bonjour,

Je suis débutant en PHP.

Je dois insérer des données dans une table de ma base de données MySQL. Dans ma page PHP, j'ai créé une requête SQL "insert into ..." qui fonctionne très bien.

Le problème c'est que dans cette table la clé primaire ne peut pas être incrémentée automatiquement. Ce que j'aimerais c'est lorsque j'insère une nouvelle ligne dans ma table, la clé primaire de ma nouvelle ligne soit égale a la clé primaire de la dernière ligne présente dans ma table +1

Est ce que c'est possible de faire ça? Si oui comment?

J'aimerais savoir si quelqu'un a deja une fonction PHP ou un script PHP pour réaliser ça

Merci d'avance pour votre

Flipmode
A voir également:

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
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
0
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
Pour faire cela :

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.
0
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
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 )
)
0
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
0
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
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é :
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)
0

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
0
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
0