规范化MySQL数据库未更新
我想做什么: 我有一个包含3个表的规范化数据库。我要做的就是将所有规范化MySQL数据库未更新,mysql,Mysql,我想做什么: 我有一个包含3个表的规范化数据库。我要做的就是将所有模型值替换为系列值,其中OEMID等于8 我从每个表中选取了5行作为示例: 系列表 +--------+----------+ | series | seriesid | +--------+----------+ | 1001 | 7 | | 10036 | 8 | | 10067 | 9 | | 1007 | 10 | | 10076 | 11 |
模型
值替换为系列
值,其中OEMID
等于8
我从每个表中选取了5行作为示例:
系列表
+--------+----------+
| series | seriesid |
+--------+----------+
| 1001 | 7 |
| 10036 | 8 |
| 10067 | 9 |
| 1007 | 10 |
| 10076 | 11 |
+--------+----------+
+---------+----------------------------------------+
| ModelId | Model |
+---------+----------------------------------------+
| 6694 | 1001 - 71 Flexi Unit Planter - 30Aug01 |
| 8264 | 10036 - 315SJ Backhoe Loader |
| 8263 | 10067 - 310J Backhoe Loader - 20Jul17 |
| 6693 | 1007 - 60 Lawn Tractor - 30Aug01 |
| 8262 | 10076 - 853JH Tracked Harvester |
+---------+----------------------------------------+
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| partnumber | partname | description | imageurl | qty | oemid | seriesid | modelid | functiongroupid | assemblynameid |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| A32 | Lens | RED | AP3415_________UN01JAN94.gif | 2 | 8 | 7 | 6694 | 12318 | 449980 |
| 14274 | Nut | M10 | TX1061736______UN20JUL09.gif | 1 | 8 | 8 | 8264 | 13996 | 884056 |
| C1115 | HC | NLA ORDER | 0000897883____________A2.gif | 1 | 8 | 9 | 8263 | 13962 | 880092 |
| 03H1626 | BOLT | 1/4 X 1/2 | M5004__________UN02JAN94.gif | 1 | 8 | 10 | 6693 | 17549 | 89782 |
| 1854 | Screw | M10 X 80 | TX1030795______UN25OCT07.gif | 4 | 8 | 11 | 8262 | 14029 | 891643 |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
型号表
+--------+----------+
| series | seriesid |
+--------+----------+
| 1001 | 7 |
| 10036 | 8 |
| 10067 | 9 |
| 1007 | 10 |
| 10076 | 11 |
+--------+----------+
+---------+----------------------------------------+
| ModelId | Model |
+---------+----------------------------------------+
| 6694 | 1001 - 71 Flexi Unit Planter - 30Aug01 |
| 8264 | 10036 - 315SJ Backhoe Loader |
| 8263 | 10067 - 310J Backhoe Loader - 20Jul17 |
| 6693 | 1007 - 60 Lawn Tractor - 30Aug01 |
| 8262 | 10076 - 853JH Tracked Harvester |
+---------+----------------------------------------+
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| partnumber | partname | description | imageurl | qty | oemid | seriesid | modelid | functiongroupid | assemblynameid |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| A32 | Lens | RED | AP3415_________UN01JAN94.gif | 2 | 8 | 7 | 6694 | 12318 | 449980 |
| 14274 | Nut | M10 | TX1061736______UN20JUL09.gif | 1 | 8 | 8 | 8264 | 13996 | 884056 |
| C1115 | HC | NLA ORDER | 0000897883____________A2.gif | 1 | 8 | 9 | 8263 | 13962 | 880092 |
| 03H1626 | BOLT | 1/4 X 1/2 | M5004__________UN02JAN94.gif | 1 | 8 | 10 | 6693 | 17549 | 89782 |
| 1854 | Screw | M10 X 80 | TX1030795______UN25OCT07.gif | 4 | 8 | 11 | 8262 | 14029 | 891643 |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
主数据表
+--------+----------+
| series | seriesid |
+--------+----------+
| 1001 | 7 |
| 10036 | 8 |
| 10067 | 9 |
| 1007 | 10 |
| 10076 | 11 |
+--------+----------+
+---------+----------------------------------------+
| ModelId | Model |
+---------+----------------------------------------+
| 6694 | 1001 - 71 Flexi Unit Planter - 30Aug01 |
| 8264 | 10036 - 315SJ Backhoe Loader |
| 8263 | 10067 - 310J Backhoe Loader - 20Jul17 |
| 6693 | 1007 - 60 Lawn Tractor - 30Aug01 |
| 8262 | 10076 - 853JH Tracked Harvester |
+---------+----------------------------------------+
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| partnumber | partname | description | imageurl | qty | oemid | seriesid | modelid | functiongroupid | assemblynameid |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| A32 | Lens | RED | AP3415_________UN01JAN94.gif | 2 | 8 | 7 | 6694 | 12318 | 449980 |
| 14274 | Nut | M10 | TX1061736______UN20JUL09.gif | 1 | 8 | 8 | 8264 | 13996 | 884056 |
| C1115 | HC | NLA ORDER | 0000897883____________A2.gif | 1 | 8 | 9 | 8263 | 13962 | 880092 |
| 03H1626 | BOLT | 1/4 X 1/2 | M5004__________UN02JAN94.gif | 1 | 8 | 10 | 6693 | 17549 | 89782 |
| 1854 | Screw | M10 X 80 | TX1030795______UN25OCT07.gif | 4 | 8 | 11 | 8262 | 14029 | 891643 |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
因此,让我们来看masterdata表中的第一行。我想将系列1001
替换为1001-71 Flexi Unit Planter-30Aug01
我所尝试的:
我尝试的第一件事是:
INSERT INTO SERIES(SERIES) SELECT DISTINCT M.MODEL FROM MASTERDATA MD JOIN MD.MODELID=M.MODELID WHERE MD.OEMID=8;
SERIESID
列是自动递增的,因此我不需要手动设置id。然后我尝试更新MASTERDATA
表以反映此更改:
UPDATE MASTERDATA MD JOIN MODEL M ON M.MODELID=MD.MODELID JOIN SERIES S ON S.SERIES=M.MODEL SET MD.SERIESID=S.SERIESID WHERE MD.OEMID=8;
MODELID
将MODEL
表连接到MASTERDATA
表,因为我没有更改任何MODEL
值。然后,我加入MODEL
表上的SERIES
表,其中MODEL
等于SERIES
。这将让我获得每个型号的序列ID
。然后我只需将MASTERDATA
中的SERIESID
设置为SERIESID
表中的SERIESID
。但是,当我运行它时,它不起作用
我唯一剩下的选择是编写一个外部程序来处理这个问题,但如果可能的话,我不想采用这种方法。有人能提供解决方案吗
不确定这是否重要,但我正在Linux CentOS 7上运行DB
提前谢谢
编辑1:
这是插入模型
值后系列
表的外观:
+----------------------------------------+-----------+
| series | seriesid |
+----------------------------------------+-----------+
| 1001 | 7 |
| 10036 | 8 |
| 10067 | 9 |
| 1007 | 10 |
| 10076 | 11 |
| 1001 - 71 Flexi Unit Planter - 30Aug01 | 256 |
| 10036 - 315SJ Backhoe Loader | 257 |
| 10067 - 310J Backhoe Loader - 20Jul17 | 258 |
| 1007 - 60 Lawn Tractor - 30Aug01 | 259 |
| 10076 - 853JH Tracked Harvester | 260 |
+----------------------------------------+-----------+
我的计划是使用上面在2上看到的查询。
然后对series运行查询,以删除主数据表中不存在SERIESID
的任何行
编辑2:
我的目标是使主数据
看起来像这样:
+------------+----------+-------------+------------------------------+------+-------+------------+---------+-----------------+----------------+
| partnumber | partname | description | imageurl | qty | oemid | seriesid | modelid | functiongroupid | assemblynameid |
+------------+----------+-------------+------------------------------+------+-------+------------+---------+-----------------+----------------+
| A32 | Lens | RED | AP3415_________UN01JAN94.gif | 2 | 8 | 256 | 6694 | 12318 | 449980 |
| 14274 | Nut | M10 | TX1061736______UN20JUL09.gif | 1 | 8 | 257 | 8264 | 13996 | 884056 |
| C1115 | HC | NLA ORDER | 0000897883____________A2.gif | 1 | 8 | 258 | 8263 | 13962 | 880092 |
| 03H1626 | BOLT | 1/4 X 1/2 | M5004__________UN02JAN94.gif | 1 | 8 | 259 | 6693 | 17549 | 89782 |
| 1854 | Screw | M10 X 80 | TX1030795______UN25OCT07.gif | 4 | 8 | 260 | 8262 | 14029 | 891643 |
+------------+----------+-------------+------------------------------+------+-------+------------+---------+-----------------+----------------+
请尝试下面的选择查询,您的要求对我来说不是很清楚,但仍希望这能对您有所帮助
select
C.partnumber,
C.partname,
C.description,
C.imageurl,
C.qty,
C.oemid,
A.seriesid,
B.ModelId,
C.functiongroupid,
C.assemblynameid
from
Series A,
Model B,
Masterdata C
where
C.modelid=B.ModelId and
A.series = SUBSTRING_INDEX(B.Model,' - ', 1);
注意:子字符串索引
用于假设模型
表中的模型
列的第一部分与系列
表中的系列
列值相同。如果它的值与您在所讨论的编辑1中提到的值直接匹配,那么我们可以直接相等
如果上面的选择查询为您提供了所需的输出,那么要直接在Masterdata
中更新seriesid
,我们可以使用下面的更新查询
update
Series A,
Model B,
Masterdata C
set
C.seriesid = A.seriesid
where
C.modelid=B.ModelId and
A.series = SUBSTRING_INDEX(B.Model,' - ', 1);
如果要删除不匹配的条目,那么我们可以使用与此相同的where子句相反的大小写,希望这会有所帮助,S.SERIES=M.MODEL条件不匹配..1001!=1001-71柔性单元播种机-30Aug01@scaisEdge是的,但是我将模型值添加到序列表中,因此它应该与1001-71 Flexi Unit Planter-30Aug01==1001-71 Flexi Unit Planter-30Aug01匹配。不过,我还没有在我的示例中展示它。我将编辑问题以便您查看。更新问题后请告诉我。@scaisEdge现在已更新,请参阅edit:
您编辑的问题不清楚。。1) 已更新的无法从表中删除行2)如果为系列删除与seriesid不匹配的行,则删除插入时插入的扩展字符串。。首先,您需要删除匹配的seriesid,然后使用新id更新主表。。谢谢,我现在就去看看。数据总共约为100M行(在MASTERDATA
表中),因此需要一段时间才能运行。确定,然后尝试在内部表选择中添加一些限制条件,如选择查询-而不是MASTERDATA C
-尝试使用(从MASTERDATA limit 10000中选择*C
)。。这样我们就可以看到逻辑是好是坏,不用等待太久。该死,它只是作为一个空集回来。哦哦。。我甚至试过使用你的虚拟数据,但它对我有效(现在我建议,试着一个接一个地删除where
条件,看看结果,试着推断出哪种条件出了问题..我删除了和A.series=SUBSTRING_INDEX(B.Model,'-',1);
并设法取回数据