2010-02-19 4 views
1

J'ai posé cette question un peu plus tôt aujourd'hui, mais je ne suis pas sûr de savoir à quel point j'étais clair.Modifier la colonne en Auto_Increment

J'ai une colonne MySQL remplie avec les numéros ordonnés 1-56. Ces nombres ont été générés par mon script PHP, pas par auto_increment.

Ce que je voudrais faire est de rendre cette colonne auto_incrementing après que le script PHP ait défini les nombres corrects. Le script PHP fonctionne main dans la main avec une interface jQuery qui me permet de réorganiser une liste d'éléments en utilisant le plugin de l'interface utilisateur de jQuery. Une fois que je déciderai de l'ordre dans lequel je souhaite insérer les entrées, je souhaite que la colonne soit définie sur l'incrémentation automatique, de sorte que si je devais insérer une nouvelle entrée, elle reconnaîtrait le nombre le plus élevé déjà existant dans la colonne et définissez son propre numéro d'identification pour être un plus élevé que ce qui existe déjà.

Est-ce que quelqu'un a des suggestions sur la façon d'aborder ce scénario?

+0

Voulez-vous incrémenter automatiquement dans la base de données? –

+0

Oui - J'ai un autre script qui va simplement ajouter du contenu à la base de données, ce que je veux reconnaître fondamentalement quel numéro affecter à la colonne id de l'entrée. Peut-être serait-il plus judicieux que le script PHP vérifie en quelque sorte la valeur la plus élevée des données d'identification existantes et affecte l'ID des données entrantes à une valeur supérieure à celle qui existe? –

Répondre

2

Je vous suggère de créer la table avec votre auto_increment déjà en place. Vous pouvez spécifier une valeur pour la colonne auto_inc, et mysql l'utilisera, et l'insertion suivante pour spécifier une valeur NULL ou 0 pour la colonne auto_inc obtiendra comme par magie $ higher + 1 qui lui est assignée.

exemple:

mysql> create table foobar (i int auto_increment primary key);

mysql> insert into foobar values (10),(25);

mysql> insert into foobar values (null);

mysql> select * from foobar;

# returns 10,25,26

+0

Le problème que j'ai avec ceci est le fait que lors de l'utilisation de l'interface jQuery pour trier les entrées DB, si je le soumet, J'obtiens l'erreur "duplicate entry 0 for key 1" ... c'est parce que tout en essayant de redéfinir la valeur d'id pour chaque entrée, il court dans les valeurs pour les entrées qui existaient avant soumettre. Pouvez-vous penser à un moyen de contourner cela? –

0

Vous pouvez changer cela avec une requête, émise via php, en utilisant l'interface de la console mysql ou (plus facile) en utilisant phpmyadmin.

ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition; 
ALTER TABLE table_name AUTO_INCREMENT = highest_current_index + 1 

column_definiton:

old_column_definition AUTO_INCREMENT 

Plus d'infos:

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

EDIT Toujours utiliser mysql_insert_id ou la fonction appropriée de votre couche d'abstraction pour obtenir le dernier identifiant créé, car LAST_INSERT_ID peut conduire à des résultats erronés.

0

Vous pouvez passer à la mise en œuvre de auto_increment de MySQL, mais il va prendre 3 requêtes de le faire:

a) ALTER TABLE pour ajouter le auto_increment au champ en question

b) SELECT MAX(id) + 1 pour savoir ce que vous devez définir l'ID de

c) ALTER TABLE table AUTO_INCREMENT =result from (b)

MySQL considère modifier la valeur AUTO_INCREMENT une action au niveau de la table, de sorte que vous ne pouvez pas le faire en (a), et il ne vous permet pas de faire MAX(id) en (c), donc 3 requêtes.

+0

Avez-vous des suggestions sur la façon dont la syntaxe pourrait apparaître en utilisant mysql_query() de php? –

0

Dans MySQL, vous pouvez définir une valeur personnalisée pour un champ auto_increment. MySQL utilisera ensuite la plus haute valeur de colonne auto_increment pour les nouvelles lignes, essentiellement MAX(id)+1. Cela signifie que vous pouvez effectivement réserver une gamme d'ID pour une utilisation personnalisée. Par exemple:

CREATE TABLE mytable (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
col1 VARCHAR(256) 
); 
ALTER TABLE mytable AUTO_INCREMENT = 5001; 

Dans ce schéma tous les ids < 5001 sont réservées à une utilisation par votre système.Ainsi, votre script PHP peut générer automatiquement des valeurs:

for ($i=1; $i<=56; $i++) 
mysql_query("INSERT INTO mytable SET id = $i, col1= 'whatevers'"); 

Les nouvelles entrées utiliseront la plage non réservé par pas spécifier id ou le paramètre à null:

INSERT INTO mytable SET id = NULL, col1 = 'whatevers2'; 
-- The id of the new row will be 5001 

Réservant une gamme comme celui-ci est key - dans le cas où vous auriez besoin de plus de 56 lignes spéciales/système à l'avenir.

+0

Solution intéressante, je peux considérer quelque chose comme ceci .... bien qu'il serait agréable de ne pas avoir une limitation –

1

Non, arrêtez. Ce n'est pas le point de auto_increment. Si vous n'allez pas les faire trier par l'ID, alors ne les faites pas auto_increment, ajoutez juste une colonne à la fin de la table pour commander et profitez de la flexibilité supplémentaire qu'il vous offre. On dirait que vous essayez d'emballer deux ensembles d'informations différents dans une seule colonne et que ça ne va vraiment que vous mordre dans le cul bien que toutes les personnes bien intentionnées dans ce fil vous disent comment vous tirer dans le pied.

+0

Je vais les faire trier par l'id .... Je veux juste que ce numéro d'id soit d'abord personnalisé par mon script php et ensuite si j'insère une entrée, MySQL récupère là où le script PHP s'est arrêté avec la numérotation –

Questions connexes