I’m upgrading a DB schema. A table is divided into 2 tables. These two tables are linked and the only way to link them is using a varchar name field in the original table.
Problem is that customer could have duplicate names, since name is not the Primary/Unique Key.
I came here looking for ideas to make these names unique so it can be used as a key when moving the data to the two new linked tables.
As I’m writing this, I had the idea of CONCATing the current PK to name (as in CONCAT(name,id) as newName) and use this as key.
There’s also a unique code field, but this only goes into one of the new tables.
Example Schema:
tableA
a_id INT(11) PRI AUTO_INCREMENT
code VARCHAR(10) UNIQUE
name VARCHAR(30) NOT NULL
newTableB
b_id INT(11) PRI AUTO_INCREMENT
name VARCHAR(30)
newTableC
c_id INT(11) PRI AUTO_INCREMENT
b_id INT(11) FK->newTableB
code VARCHAR(10) UNIQUE
What I want:
- Generate New b_id’s (auto_increment)
- newTableB.name imported from tableA.name
- newTableC.code imported from tableA.code
- newTableC.c_id imported from tableA.a_id
a_id is an FK in another fourth table that’s staying the same. After the changes above, c_id will now be valid FK in this fourth table.
My Challenge:
How Do insert into these new tables but still keep the original name<->code<->a_id relationship and transfer tableA.a_id values to newTableC.c_id. Don’t care if b_id gets new auto_incr. values.
Not sure how clear I’m making problem come across, but feel free to ask any questions.
Thanks
Dan
I’ve usually done a task like this in several parts. First insert to table b but put the id field from a in the name column instead of the name. Then insert the data into tablec from table a. Then update tableb name field by joining to table a on the a.id and b.name fields. BUt im not sure if you can use a join in an update in mysql. Should bea way to write the statement though once you have the data there.
Alternatively, I temporarily add a column to table b called tableid. Then I put the data in tableb including the a id and use that to join to table a to get the b.id and table A data for table c. When it is done, I drop the tableA column from table b.