2010-03-01 2 views
1

Je suis en train de normaliser une base de données MySQL ....Normaliser une table, d'un à l'autre

J'ai actuellement une table qui contient 11 colonnes pour « catégories ». La première colonne est un user_id et les 10 autres sont category_id_1 - category_id_10. Certaines lignes ne peuvent contenir qu'un category_id jusqu'à category_id_1 et le reste peut être NULL.

J'ai alors une table qui a 2 colonnes, user_id et category_id ...

Quelle est la meilleure façon de transférer toutes les données en lignes distinctes dans le tableau 2, sans ajouter une ligne pour les colonnes qui sont NULL dans le tableau 1?

merci!

+0

Pourquoi cela doit-il être le meilleur moyen? Ne peut-il pas être le moyen le plus rapide et le plus facile? N'est-ce pas seulement quelque chose que vous ferez une fois? –

+0

Meilleur = le plus rapide et le plus facile! – mike

Répondre

1

Vous pouvez créer une requête pour faire tout le travail, il faut juste un peu de copier et coller, et le réglage du nom de la colonne:

INSERT INTO table2 
SELECT * FROM (
    SELECT user_id, category_id_1 AS category_id FROM table1 
    UNION ALL 
    SELECT user_id, category_id_2 FROM table1 
    UNION ALL 
    SELECT user_id, category_id_3 FROM table1 
) AS T 
WHERE category_id IS NOT NULL; 

Puisque vous suffit de faire cela 10 fois, et vous pouvez jeter le code loin lorsque vous avez terminé, je pense que cela est la meilleure façon .

0

Une table pour les utilisateurs:

users(id, name, username, etc) 

une pour les catégories:

categories(id, category_name) 

Un pour relier les deux, y compris toute information supplémentaire, vous voudrez peut-être sur cette jointure. Pour transférer les données vers la table de liens, il faudrait écrire une série d'instructions SQL INSERT. Il y a probablement une certaine façon génial de le faire en une seule fois, mais comme il n'y a que 11 catégories, il suffit de copier-coller l'OMI:

INSERT INTO categories_users 
SELECT user_id, 1 
FROM old_categories 
WHERE category_1 IS NOT NULL 
Questions connexes