2009-12-07 6 views
2

J'ai une table qui stocke "enregistrements" et a déjà la clé primaire.Création d'un "ID secondaire" dans mysql

Table A 
======= 
id (INT) PK auto_increments 
project_id (INT) 
record_text (TEXT) 

Cette table stocke "enregistrements" pour tous mes projets. Il est souhaitable d'avoir une clé secondaire qui s'incrémente automatiquement pour les projets. Exemple: Si le projet 1 avait des identifiants de (1,5,8,9). Il serait souhaitable de les stocker et de les présenter à l'utilisateur sous la forme (1,2,3,4).

Je n'ai pas la possibilité d'utiliser TRANSACTIONS et j'ai du mal à trouver une façon de le faire sans causer de problèmes de simultanéité.

Espérons que mon problème est clair. Merci d'avance pour votre aide.

Modifier (exemple): En supposant la structure:
id, project_id, fiche texte
1 1 test
2 1 test
3 2 tests
4 1 test

Mon identité est pour projet 1 serait 1,2,4. Mais je suis à la recherche d'un moyen de stocker et de les afficher pour le projet 1 1,2,3

+1

Je devrais ajouter que je ne veux pas remplacer 'id' avec le nouveau numéro. Soit un champ supplémentaire ou une deuxième table à rejoindre sur ferait l'affaire. – ws0x9

+0

peut-être "id_shown"? – namespaceform

Répondre

0

Je ne suis pas sûr de ce que je pensais, trop tard dans la journée probablement, mais j'ai pu y parvenir en ajoutant une colonne à la table:

id, pid, project_id, record_text 

pid étant le système de numérotation pour la projet.

INSERT:

INSERT INTO A (id, pid, project_id, record_text) 
VALUES (
    NULL, 
    (SELECT COALESCE(new_id, 0) + 1 FROM (SELECT MAX(new_id) AS new_id FROM atest WHERE project_id = 1) AS x), 
    1, 
    'some text' 
); 

Maintenant que mon projet change mon pid, id basé hors du projet, incrémente automatiquement aussi:

id pid project_id record_text 
1  1  1    testing 123 
2  2  1    testing 123 
3  1  2    testing 123 
4  3  1    testing 123 

Merci à tous pour vos commentaires et je me excuse ma mauvaise description du problème.

0

Vous pouvez créer votre ainsi project_id champ à auto_increment sans une clé.

+0

Je pense que le problème qu'il a provenu de la suppression des rangées plutôt que l'incrément automatique lui-même. L'ID principal est probablement auto_incremented, mais cela ne résoudra pas son problème. Il dit que si vous avez les lignes 1, 2, 3 et 4, et supprimez la ligne 3, comment pouvez-vous afficher les lignes 1, 2, 4 comme 1, 2, 3 et garder la référence à ce nombre. –

1

Je ne peux pas dire de votre question, mais si vous voulez juste présenter une liste proprement numérotée à l'utilisateur; Je voudrais gérer cela dans l'interface utilisateur; et ne vous inquiétez même pas de le stocker dans la base de données.

Si vous voulez vraiment le stocker dans la base de données, j'utiliserais un trigger qui se déclencherait sur INSERTED, et y définirais votre valeur.

+0

En notant le commentaire de Crowe, vous aurez également besoin de construire quelque chose à renuméroter dans le cas de suppressions ainsi –

+0

C'est une bonne idée de simplement l'afficher. Je pense qu'à long terme je préférerais avoir cette valeur pour de bon. Ma première pensée a été de simplement faire l'insertion, puis d'incrémenter l'ID au niveau du projet. Il semble que je devrais le faire d'une meilleure façon. – ws0x9

+0

Pouvez-vous élaborer sur votre raisonnement pour avoir cette colonne? –

1

Vous pouvez générer des numéros de ligne en utilisant des variables MySQL:

select 
    id 
, project_id 
, if (@last_id = project_id, @n, @n := @n + 1) as RunningProjId 
, record_text 
, @last_id := project_id 
from (select @n := 0, @last_id := -1) r, A 
order by project_id 

La ligne avec le if augmente la variable @n si le projet diffère de la dernière ligne. Cela dépend de la clause order by pour fonctionner. La ligne avec `` @last_id: = id_projet saves the id_projet »pour référence lorsque la ligne suivante est sélectionnée.

La première partie de la clause from est l'initialisation de la variable. La deuxième partie est votre table appelée A.

+0

J'ai essayé d'appliquer cette requête mais 'RunningProjId' renuméroté' project_id'. Je cherche à renuméroter 'id'. Je suis en train de jouer avec ça maintenant ... Cela semble prometteur. – ws0x9

+0

Ouais tout ce que j'avais à faire était de changer @last_id = project_id à @last_id = id – ws0x9

+0

Oublié de le dire mais merci Andomar! – ws0x9