我在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`)
);
其中rgns
。a_id
是ascs
上的外键。id
和sms
。r_id
是rgns
上的外键{1}}。id
。
我已经创建了三个表,并使用ascs
表中的唯一数据成功填充了前两个rgns
和smts_import
。当我尝试仅使用sms
,SCode
,SName
,AM
,AF
和{填充第三个表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_import
中sms
。r_id
字段中的正确值。 rgns
字段?
感谢您的帮助
答案 0 :(得分:0)
“RgnCode和SCode字段之间的关系是多对一的” 因此,每个SCode也会获得许多rgns.id。 如果您选择不同的rgns.id,SCode等,您将获得每个SCode不止一次,具体取决于您拥有多少RgnCode。 我建议在sms表中添加一个id列,并创建一个单独的表sms2rgns,其中包含一对多关系sms.id - > rgns.id