将非关系表拆分为多个关系表

时间:2014-01-27 12:21:19

标签: mysql csv relational-database

我在MySQL 5数据库中有60000行的下表,该数据库是从CSV文件派生的:

CREATE TABLE `smts_import` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `AscCode` varchar(5) NOT NULL,
  `AscName` varchar(50) NOT NULL,
  `RgnCode` varchar(5) NOT NULL,
  `RgnName` varchar(100) NOT NULL,
  `SCode` varchar(30) NOT NULL,
  `SName` varchar(100) NOT NULL,
  `AM` int(11) NOT NULL,
  `AF` int(11) NOT NULL,
  `LG` decimal(10,4) NOT NULL,
  `LT` decimal(10,4) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ars_codes` (`AscCode`,`RgnCode`,`SCode`),
  KEY `s_code` (`SCode`)
);

,其中包含大量重复数据。 SCode是唯一的,RgnCode和SCode字段之间的关系是多对一的,AscCode和RgnCode字段之间也是如此。 我想以关系方式将数据拆分(规范化)为三个单独的表,这样就不会重复数据:

CREATE TABLE `ascs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a_code` varchar(6) NOT NULL,
  `a_name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `a_code` (`a_code`)
);

CREATE TABLE `rgns` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a_id` int(11) NOT NULL,
  `r_code` varchar(6) NOT NULL,
  `r_name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `a_id`+`r_code` (`a_id`, `r_code`),
  KEY `r_code` (`r_code`)
);

CREATE TABLE `sms` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `r_id` int(11) NOT NULL,
  `s_code` varchar(16) NOT NULL,
  `s_name` varchar(100) NOT NULL,
  `a_m` int(11) NOT NULL,
  `a_f` int(11) NOT NULL,
  `lg` decimal(10,4) NOT NULL,
  `lt` decimal(10,4) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `r_id+s_code` (`r_id`,`s_code`),
  KEY `s_code` (`s_code`)
);

其中rgnsa_idascs上的外键。idsmsr_idrgns上的外键{1}}。id

我已经创建了三个表,并使用ascs表中的唯一数据成功填充了前两个rgnssmts_import。当我尝试仅使用smsSCodeSNameAMAF和{填充第三个表LG时出现问题来自LT表的{1}}字段,加上smts_import表中的相应ID。在这里,我迷路了,我尝试了以下几种变体:

rgns

但我最终得到的记录太多了。如何编写此insert语句以从INSERT INTO sms (r_id, s_code, s_name, a_m, a_f, lg, lt) SELECT DISTINCT sr.id, SCode, SName, AM, AF, LG, LT FROM sms_import AS si, rgns AS sr, ascs AS sa WHERE (sr.r_code = si.RgnCode) AND (sr.a_id = sa.id) AND (sa.a_code = si.AscCode) ORDER BY SCode 表中的所有记录中获取相应的字段,以及sms_importsmsr_id字段中的正确值。 rgns字段?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

“RgnCode和SCode字段之间的关系是多对一的” 因此,每个SCode也会获得许多rgns.id。 如果您选择不同的rgns.id,SCode等,您将获得每个SCode不止一次,具体取决于您拥有多少RgnCode。 我建议在sms表中添加一个id列,并创建一个单独的表sms2rgns,其中包含一对多关系sms.id - > rgns.id