Normalized MySQL database not updating
Normalized MySQL database not updating
What I want to do:
I have a normalized database containing 3 tables. All I want to do is replace all the MODEL values with the SERIES values where the OEMID equals 8.
MODEL
SERIES
OEMID
I've taken 5 rows from each table as an example:
Series Table
+--------+----------+
| series | seriesid |
+--------+----------+
| 1001 | 7 |
| 10036 | 8 |
| 10067 | 9 |
| 1007 | 10 |
| 10076 | 11 |
+--------+----------+
Model Table
+---------+----------------------------------------+
| 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 |
+---------+----------------------------------------+
Masterdata Table
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| 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 |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
So lets take the first row in the masterdata table. I want to replace the series 1001 with 1001 - 71 Flexi Unit Planter - 30Aug01
1001
1001 - 71 Flexi Unit Planter - 30Aug01
What I've Tried:
The first thing I tried was:
Inserting all distinct models into the series table where the oemid=8
INSERT INTO SERIES(SERIES) SELECT DISTINCT M.MODEL FROM MASTERDATA MD JOIN MD.MODELID=M.MODELID WHERE MD.OEMID=8;
Since the SERIESID column is auto-incrementing, I didn't need to manually set the id. I then attempted to update the MASTERDATA table to reflect this change:
SERIESID
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;
The idea for this query is that the MODEL table is joined to the MASTERDATA table using MODELID since I'm not changing any MODEL values. Then, I join the SERIES table on the MODEL table where the MODEL is equal to SERIES. This will let me get the SERIESID for each MODEL. Then I simply set the SERIESID in MASTERDATA to the SERIESID in the SERIES table. However, this did not work when I ran it.
MODEL
MASTERDATA
MODELID
MODEL
SERIES
MODEL
MODEL
SERIES
SERIESID
MODEL
SERIESID
MASTERDATA
SERIESID
SERIES
My only remaining option is to write an external program to deal with this, but I'd prefer not to take this route if possible. Can anyone offer a solution?
Not sure if it matters, but I'm running the DB on Linux CentOS 7.
Thanks in advance.
EDIT 1:
This is what the SERIES table looks like after inserting the MODEL values:
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 |
+----------------------------------------+-----------+
My plan was to use the query you can see above on 2. then run a query on series to remove any rows where the SERIESID doesn't exist in the MASTERDATA table.
2.
SERIESID
MASTERDATA
EDIT 2:
I'm aiming for the MASTERDATA to look like this:
MASTERDATA
+------------+----------+-------------+------------------------------+------+-------+------------+---------+-----------------+----------------+
| 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 |
+------------+----------+-------------+------------------------------+------+-------+------------+---------+-----------------+----------------+
@scaisEdge Yes, but I added the model values to the series table, so it should match 1001 - 71 Flexi Unit Planter - 30Aug01 == 1001 - 71 Flexi Unit Planter - 30Aug01. I haven't shown it on my example though. I'll edit the question so you can see.
– Lucax
Jul 2 at 9:20
let me know when you have update the question ..
– scaisEdge
Jul 2 at 9:21
@scaisEdge It's now updated, see
EDIT:– Lucax
Jul 2 at 9:27
EDIT:
Your edited question is not clear .. 1) an updated can't remove rows from tables 2) if you remove for SERIES the rows related to seriesid that don't match you remove the extended string inserted with the insert .. .. could be that firts you want delete form series the seriesid that match and second you want update the master table with the new id .. ..
– scaisEdge
Jul 2 at 9:42
1 Answer
1
Try this select query below, your requirement is not that clear for me but still hope this will help you some how,
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);
Note: SUBSTRING_INDEX is used assuming first part of the Model column in Model table is same as the series column value in Series table. If its directly matching value as you mentioned in EDIT 1 in question, then we can directly equate.
SUBSTRING_INDEX
Model
Model
series
Series
if above select query gives you the required output, then to update seriesid directly in Masterdata we can use below update query,
seriesid
Masterdata
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);
If want to remove the entries other than which matches, then we can use the reverse case of this same where clause, Hope this will be of some help,
Thanks I'll check it out now. The data is about 100M rows in total (in the
MASTERDATA table), so it'll take a while to run.– Lucax
Jul 2 at 10:42
MASTERDATA
ok Then try Adding some limit conditions in the inner table selections, like in select query - instead of
Masterdata C - try with (select * from Masterdata limit 10000)C .. this way we can see the logic will be ok or not without waiting much..– Jithin Scaria
Jul 2 at 10:48
Masterdata C
(select * from Masterdata limit 10000)C
Damn, it just comes back as an empty set.
– Lucax
Jul 2 at 10:56
oh oh .. I even tried with your dummy data , it worked for me though .. :( now i would suggest, try removing
where conditions one by one and see the result, try to deduce which condition goes wrong ..– Jithin Scaria
Jul 2 at 10:59
where
I removed
and A.series = SUBSTRING_INDEX(B.Model,' - ', 1); and managed to get data back– Lucax
Jul 2 at 11:08
and A.series = SUBSTRING_INDEX(B.Model,' - ', 1);
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
the S.SERIES=M.MODEL condition don't match ..1001 != 1001 - 71 Flexi Unit Planter - 30Aug01
– scaisEdge
Jul 2 at 9:17