mysql - 自动表规范化

标签 mysql database database-design automation normalization

我有一个具有以下结构的表格(简化):

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

我想将其规范化,为品牌制作一个单独的表格(它将包含有关每个品牌的附加数据) 所以我想以此结束

文章表:

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

品牌表

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

此表有太多品牌,无法手动执行此操作。 有什么简单的方法可以自动执行此操作吗? 我正在使用 MySQL

最佳答案

正如其他答案所建议的,您可以使用 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)

关于mysql - 自动表规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3082527/

相关文章:

mysql - SQL - LEFT JOIN 多个条件 - 优先级

c# - Xamarin 安卓 C# SQLite

php - 有什么方法可以在数据库中存储有关匿名/访客用户的信息?

java - SQL表结构反馈

json - 在 Firebase 数据库中构建好友列表

iphone - 将 iPhone 应用程序与 MySQL 数据库连接的教程? (接口(interface) Objective-C 与 mysql)

php - 将列值存储在数组中

mysql - 检索计算表达式的 COUNT 个

database - HTML5 localStorage设计问题

database - Slick 中的 Scala 枚举(案例对象),良好实践