2012-04-15 2 views
0

J'ai le tableau suivant my_table avec la clé primaire id mis à AUTO_INCREMENT.Comment puis-je ajouter un "groupe" de lignes et incrémenter leur "id de groupe" dans MySQL?

id group_id data_column 
1 1   'data_1a' 
2 2   'data_2a' 
3 2   'data_2b' 

Je suis coincé en train de construire une requête qui prendra un tableau de données, disent [ 'data_3a', 'data_3b'], et incrémenter de façon appropriée la group_id pour obtenir:

id group_id data_column 
1 1   'data_1a' 
2 2   'data_2a' 
3 2   'data_2b' 
4 3   'data_3a' 
5 3   'data_3b' 

Je pense que ce serait facile à faire en utilisant une clause WITH, mais cela n'est pas supporté par MySQL. Je suis très nouveau à SQL, donc peut-être que j'organise mes données dans le mauvais sens? (Un groupe est censé représenter un groupe de fichiers qui ont été téléchargés ensemble via un formulaire Chaque ligne est un fichier unique et la colonne de données stocke son chemin).

Le code « Psuedo SQL » j'avais à l'esprit était:

INSERT INTO my_table (group_id, data_column) 
VALUES ($NEXT_GROUP_ID, 'data_3a'), ($NEXT_GROUP_ID, 'data_3b') 
LETTING $NEXT_GROUP_ID = (SELECT MAX(group_id) + 1 FROM my_table) 

où le composé clause « LOCATIF » serait seulement d'évaluer une fois au début de la requête.

+0

Il me semble que si vous pouviez construire les valeurs de "data_column" à partir des valeurs des autres champs, "data_column" dépendrait fonctionnellement des autres champs, et serait donc redondant. Si c'est une donnée réelle, quelqu'un doit l'entrer. – wildplasser

Répondre

0

Je préfère avoir une table séparée pour les groupes si un groupe représente des fichiers qui appartiennent ensemble, surtout quand vous voulez peut-être sauvegarder méta-données sur ce groupe (comme l'utilisateur qui télécharge, la date, etc.). Sinon (dans ce cas) vous obtiendriez des données redondantes (ce qui est mauvais - la plupart du temps).

Sinon, MySQL a quelque chose comme des variables. Check out http://dev.mysql.com/doc/refman/5.1/en/set-statement.html

+1

Merci, une table séparée pour les groupes a beaucoup de sens. – mmunoz

1

Vous pouvez démarrer une transaction en sélectionnant max (group_id) +1, puis en effectuant les insertions. Ou même en verrouillant la table pour que d'autres ne puissent pas la changer (insérer) serait possible