2010-06-21 3 views
2

У меня есть таблица с этой структурой (упрощенной):Automating таблица нормализация

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

И я хочу, чтобы нормализовать его сделать отдельную таблицу для торговой марки (он будет иметь дополнительные данные о каждом бренде) Так что я хочу закончить с этим

статьи таблице:

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

бренд стол

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

В этой таблице слишком много марок, чтобы сделать это вручную. Любой простой способ автоматизировать это? Я использую MySQL

+0

Есть несколько брендов за статью? – APC

+0

Нет, только один бренд за статью –

ответ

2

Как было предложено другие ответы, вы можете использовать синтаксис INSERT ... SELECT, чтобы сделать что-то вроде этого:

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); 

Контрольный пример:

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'); 

Результат:

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. Я хотел бы использовать create table as select ... синтаксис для создания брендов, таблицы генерируется идентификатор-s
  2. создать столбец Brand_ID, и заполнить его сгенерированный идентификатор-s из таблицы брендов , используя существующие столбцы брендов в таблице статей.
  3. удалить бренд столбцы из таблицы статьи, за исключением, конечно, Brand_ID
  4. создать внешний ключ ...
1

Создание таблицы брендов должно быть довольно просто:

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; 

Аналогичная история с созданием отношений между вашим оригинальным столом и таблицей новых брендов, только этот оператор выбора в вашей вставке будет выглядеть так:

SELECT t.artId, b.id 
FROM table t JOIN brands b ON (t.ArtBrand = b.brand_name) 
Смежные вопросы