Attribuer une valeur lors de la création d'une table

Eléphanteau du PHP | 24 Messages

03 nov. 2006, 22:10

Bonjour,

Je voudrai créer une table MySql dynamiquement à partir de Php.

Ainsi, un visiteur indique sa ville dans un formulaire et une table au nom de sa ville est créée (si elle n'existe pas déjà dans ma base) avec comme premier enregistrement l'identité de ce visiteur.

Jusque là, je sais comment y arriver.

En revanche, je souhaiterai que la table ainsi générée comporte un champ "identifiant" dont le numéro s'incrémente au fur et à mesure des enregistrements grâce à Php. Pour calculer un identifiant à un enregistrement suivant, je récupère la dernière valeur attribuée dans ma table, je l'incrémente, puis je retourne la nouvelle valeur avec le nouveau enregistrement.

Aussi comment attribuer dynamiquement une première valeur (par exemple 10001) à mon champ "identifiant" lors de la création ?

Je n'ai rien trouvé dans la documentation de MySql, mais peut-être suis-je passé à côté.

En tout cas, merci de votre aide.

Cordialement,

I.

ViPHP
ViPHP | 1961 Messages

03 nov. 2006, 23:37

Bonjour,

Je ne comprends pas bien ton but mais pour faire démarrer l'auto incrémentation à une valeur donnée, à la fin de la création de la table tu ajoutes
AUTO_INCREMENT [=] value
comme ceci
CREATE TABLE table_name(
id INT UNSIGNED AUTO_INCREMENT,
....
))ENGINE=engine AUTO_INCREMENT = 10001;
Si ta table existe avec
ALTER TABLE ....
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 2144 Messages

04 nov. 2006, 00:43

Salut,

Je pense qu'il serait intéressant que tu nous expliques plus en détails ce que tu souhaites faire. Car la structure de base de donnée que tu envisages n'est pas vraiment une solution normalisée, et peut donc poser pas mal de problèmes par la suite. Donc si tu veux avoir des avis plus complêts, il faudrait qu'on en sache plus...

ViPHP
ViPHP | 656 Messages

04 nov. 2006, 02:28

MySQL sait faire lui même l'auto-incrément tout de même, c'est l'une des fonctionnalité les plus utilisée, tu ne devrais pas te compliquer la vie :

Code : Tout sélectionner

CREATE TABLE `user` ( `id` TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 55 ) NOT NULL ) ENGINE = innodb;

ViPHP
ViPHP | 1961 Messages

04 nov. 2006, 02:32

La question est
Aussi comment attribuer dynamiquement une première valeur (par exemple 10001) à mon champ "identifiant" lors de la création ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 656 Messages

04 nov. 2006, 02:43

Si tu utilise l'auto-increment ce sera :

Code : Tout sélectionner

CREATE TABLE `user` ( `id` tinyint(4) NOT NULL auto_increment, `name` varchar(55) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
où AUTO_INCREMENT=1 est l'offset de départ.

Sinon c'est comme ça :

Code : Tout sélectionner

CREATE TABLE `user` ( `id` tinyint(4) NOT NULL auto_increment, `name` varchar(55) NOT NULL default 'Anonyme', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
où Anonyme est la valeur par default de la colone name si on ne donne rien comme valeur.

C'est pratique par exemple pour un profil, pour mettre par exemple N/A lorsque l'utilisateur n'a pas renseigné les champs ou noavatar.jpg pour sa photo s'il n'en mets pas.

ViPHP
ViPHP | 1961 Messages

04 nov. 2006, 02:49

En quoi ça répond à la question ?
comment attribuer dynamiquement une première valeur (par exemple 10001) à mon champ "identifiant" lors de la création ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 656 Messages

04 nov. 2006, 02:55

Code : Tout sélectionner

CREATE TABLE `user` ( `id` tinyint(4) NOT NULL auto_increment, `name` varchar(55) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10001 ;

ViPHP
ViPHP | 1961 Messages

04 nov. 2006, 02:57

C'est ce qui a été dit dans la première réponse
Bonjour,

Je ne comprends pas bien ton but mais pour faire démarrer l'auto incrémentation à une valeur donnée, à la fin de la création de la table tu ajoutes
AUTO_INCREMENT [=] value
comme ceci
CREATE TABLE table_name(
id INT UNSIGNED AUTO_INCREMENT,
....
))ENGINE=engine AUTO_INCREMENT = 10001;
Si ta table existe avec
ALTER TABLE ....
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 656 Messages

04 nov. 2006, 02:59

Eh bien alors où est ton problème ? Puisque je suis le deuxième à te dire qu'il faut faire de la sorte ?

Tu la mets en dur ou tu utilise cette methode, ta pas le choix, le SQL c'est pas aussi flexible que le PHP.

[EDIT] Désolé Ajoloca, je te prenais pour le posteur du sujet.

ViPHP
ViPHP | 1961 Messages

04 nov. 2006, 03:03

Tu n'as pas compris que c'était pas la personne qui à posé la question, mais celle qui a répondu.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 656 Messages

04 nov. 2006, 03:04

Exactement à cause de ce message que tu a posté :P
En quoi ça répond à la question ?
comment attribuer dynamiquement une première valeur (par exemple 10001) à mon champ "identifiant" lors de la création ?

Eléphanteau du PHP | 24 Messages

04 nov. 2006, 10:10

J'ai essayé d'utiliser la syntaxe proposé par Ultiny, à savoir :

Code : Tout sélectionner

CREATE TABLE `user` ( `id` tinyint(4) NOT NULL auto_increment, `name` varchar(55) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
A priori, ça semble fonctionner, mais je rencontre un bug qui me semble étrange.

Lorsque j'indique la valeur "1", ça marche.

Lorsque j'indique la valeur "100", ça marche.

Mais ça ne fonctionne plus passé la valeur "127" ! que j'inscrive dans ma requête "AUTO_INCREMENT=127" ou que cette valeur soit atteinte par des enregistrements successifs auto-incrémentés.

Ainsi, à partir de la valeur 127, phpMyAdmin m'indique aorès mon insertion :

Code : Tout sélectionner

MySQL a répondu: #1062 - Duplicate entry '127' for key 1
Je n'y connais pas grand'chose en informatique, mais il me semble que 127 (soit 2 puissance 7 -1 - non, ne riez pas !) n'est pas une valeur au hasard : erreur logique ?

Merci beaucoup.

Cordialement,

V.

Mammouth du PHP | 19672 Messages

04 nov. 2006, 10:14

Parce que tu as mis en type TINYINT : un TINYINT signé va de -126 à +127 : un TINYINT NON signé ira de 0 à +255 : pour utiliser des nombres plus importants, il faut un type approprié : SMALLINT, MEDIUMINT ou simplement INT. Et pour une clé primaire, utilise le type choisi en non signé, par exemple INT UNSIGNED.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 24 Messages

04 nov. 2006, 10:21

Cyrano,

Pardon pour mon manque de culture !

Merci de la précision, salvatrice.

Bonne journée,

I.