2010-06-21 6 views
2

J'ai une table avec cette structure (simplifiée):normalisation de la table Automatiser

artID: 1 
artName: TNT 
ArtBrand: ACME 
... 

Et je veux normaliser faire un tableau distinct pour la marque (il aura des données supplémentaires sur toutes les marques) Je veulent finir avec ce tableau de l'article

:

artID: 1 
artName: TNT 
brandID: 1 
... 

table de marque

brandID: 1 
brandName: ACME 
brandInfo: xyz 
.... 

Cette table a beaucoup trop de marques pour le faire manuellement. Un moyen facile d'automatiser cela? J'utilise MySQL

+0

Y at-il Marques plusieurs par article? – APC

+0

Non, une seule marque par article –

Répondre

2

Comme les autres réponses proposées, vous pouvez utiliser la syntaxe INSERT ... SELECT faire quelque chose comme ceci:

INSERT INTO brands (brandName) 
SELECT artBrand 
FROM  original 
GROUP BY artBrand; 

INSERT INTO articles (artName, brandID) 
SELECT o.artName, b.brandID 
FROM  original o 
JOIN  brands b ON (b.brandName = o.artBrand); 

Cas de test:

CREATE TABLE original (artID int, artName varchar(10), artBrand varchar(10)); 
CREATE TABLE articles (artID int auto_increment primary key, artName varchar(10), brandID int); 
CREATE TABLE brands (brandID int auto_increment primary key, brandName varchar(10)); 

INSERT INTO original VALUES (1, 'TNT1', 'ACME1'); 
INSERT INTO original VALUES (2, 'TNT2', 'ACME1'); 
INSERT INTO original VALUES (3, 'TNT3', 'ACME1'); 
INSERT INTO original VALUES (4, 'TNT4', 'ACME2'); 
INSERT INTO original VALUES (5, 'TNT5', 'ACME2'); 
INSERT INTO original VALUES (6, 'TNT6', 'ACME3'); 
INSERT INTO original VALUES (7, 'TNT7', 'ACME3'); 
INSERT INTO original VALUES (8, 'TNT8', 'ACME3'); 
INSERT INTO original VALUES (9, 'TNT9', 'ACME4'); 

Résultat:

SELECT * FROM brands; 
+---------+-----------+ 
| brandID | brandName | 
+---------+-----------+ 
|  1 | ACME1  | 
|  2 | ACME2  | 
|  3 | ACME3  | 
|  4 | ACME4  | 
+---------+-----------+ 
4 rows in set (0.00 sec) 


ELECT * FROM articles; 
+-------+---------+---------+ 
| artID | artName | brandID | 
+-------+---------+---------+ 
|  1 | TNT1 |  1 | 
|  2 | TNT2 |  1 | 
|  3 | TNT3 |  1 | 
|  4 | TNT4 |  2 | 
|  5 | TNT5 |  2 | 
|  6 | TNT6 |  3 | 
|  7 | TNT7 |  3 | 
|  8 | TNT8 |  3 | 
|  9 | TNT9 |  4 | 
+-------+---------+---------+ 
9 rows in set (0.00 sec) 
1
  1. J'utiliser create table as select ... syntaxe pour créer les marques table générée id-s
  2. créer la colonne brand_id, et remplissez-le avec l'id-s généré à partir de la table des marques , en utilisant les colonnes de la marque existante dans le tableau de l'article.
  3. supprimer les colonnes de la marque de table article, sauf bien sûr brand_id
  4. créer la clé étrangère ...
1

Génération table marques devrait être assez simple:

CREATE TABLE brands ( 
    id INT PRIMARY KEY AUTO_INCREMENT, 
    brand_name VARCHAR(50), 
    brand_info VARCHAR(200) 
); 

INSERT INTO brands VALUES (brand_name) 
SELECT ArtBrand FROM Table 
GROUP BY ArtBrand; 

histoire similaire à la création de relations entre votre table d'origine et la nouvelle table de marques, juste cette déclaration de sélection dans votre insertion ressemblera à ceci: