规范化的MySQL数据库未更新

时间:2018-07-02 09:06:20

标签: mysql

我想做什么:

我有一个标准化的数据库,其中包含3个表。我要做的就是用MODEL等于8的SERIES值替换所有OEMID值。

我以每个表中的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 |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+

因此,让我们采用masterdata表中的第一行。我想将1001系列替换为1001 - 71 Flexi Unit Planter - 30Aug01

我尝试过的事情:

我尝试的第一件事是:

  1. 将所有不同的模型插入到oemid = 8

    的系列表中
    INSERT INTO SERIES(SERIES) SELECT DISTINCT M.MODEL FROM MASTERDATA MD JOIN MD.MODELID=M.MODELID WHERE MD.OEMID=8;
    
  2. 由于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;
    

该查询的目的是因为MODEL表已使用MASTERDATA连接到MODELID表,因为我没有更改任何MODEL值。然后,我在SERIES等于MODEL的{​​{1}}表上加入MODEL表。这将使我得到每个SERIES的{​​{1}}。然后,我只需将SERIESID中的MODEL设置为SERIESID表中的MASTERDATA。但是,这在我运行时不起作用。

我唯一剩下的选择是编写一个外部程序来处理此问题,但我宁愿不要走这条路。谁能提供解决方案?

不确定是否重要,但是我正在Linux CentOS 7上运行数据库。

谢谢。

编辑1:

这是插入SERIESID值后的SERIES表的样子:

SERIES

我的计划是使用上面在MODEL上看到的查询,然后对系列运行查询以删除+----------------------------------------+-----------+ | 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.的所有行。

编辑2:

我希望SERIESID看起来像这样:

MASTERDATA

1 个答案:

答案 0 :(得分:2)

请在下面尝试执行此选择查询,您的要求对我来说还不是很清楚,但仍希望它能对您有所帮助

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

注意::假设SUBSTRING_INDEX表中Model列的第一部分与{中的Model列的值相同,则使用series {1}}表。如果它与您在 EDIT 1 中提到的值直接匹配,那么我们可以直接将其等同。

如果上面的选择查询为您提供了所需的输出,那么要直接在Series中更新seriesid,我们可以使用下面的更新查询,

Masterdata

如果要删除匹配项以外的条目,则可以使用相同的where子句的相反情况,希望对您有所帮助,