with implicit join :
INSERT into table1(id, list of other columns) select m.newID, list of other columns from table2, tmpIDMAP where m.id = table2.id
UPDATE table3, tmpIDMAP SET table3.parentID = m.newID where m.id = table3.parentID
Andrew Mull wrote:
Thank you. I'll have to review the SQL carefully as I haven't used inner joins in quite some time :)
Quoting [EMAIL PROTECTED]:
Create a temporary table that will act as a map between your old IDs and your new ones. That way you can re-use those values and change them from the old values to the new values.
LOCK TABLE table1 WRITE, table2 WRITE, table3 WRITE;
select @max_id:=max(id) FROM table1;
CREATE TEMPORARY TABLE tmpIDMAP SELECT id, [EMAIL PROTECTED] as newID FROM table2
INSERT into table1(id, list of other columns) select m.newID, list of other columns from table2
INNER JOIN tmpIDMAP m
ON m.id = table2.id
UPDATE table3 INNER JOIN tmpIDMAP m ON m.id = table3.parentID SET table3.parentID = m.newID
(repeat for other child tables)
UNLOCK
I don't have time to give a better explanation right now but if you write the list back, I can fill in the details later.
Shawn Green Database Administrator Unimin Corporation - Spruce Pine
Andrew Mull <[EMAIL PROTECTED]> wrote on 12/21/2004 12:20:57 PM:
You are correct in that I need to merge two tables. However, I'm not clear on how to update the FKs in the sub tables.
Example, the main table (Person) has a sub table (Address). Person has
a 1:N
relationship with Address. So Address has the Person's ID as a FK. How
do I
update the FK in Address with the new ID assigned to Person that was
created
with the merge?
Thanks for the help!
Quoting Philippe Poelvoorde <[EMAIL PROTECTED]>:
Andrew Mull wrote:
I'm working on a rather large database with many cross-linked tables
currently using auto increment IDs. The system is primarily a web
based
system, however, there will be times that the system will be run as
a
stand
alone server...meaning no internet connection is available.
The question arises that if someone enters information to the
database on
the
website, while others are entering information on the local
database, what
is
the best way to merge the data? I would imagine that we would run
into
many
duplicate auto increment IDs.
I'm sure that for one table insert, this would not be a problem as I
could
store the SQL statement in a text file without the ID specified, and
run
it
as
a batch process on the live server when we get connectivity. But I
don't
have
a handle on how to update the sub tables that have a FK pointer.
Any ideas?
Thanks!
-Andy
I understand your question as the following: you want to merge 2
tables
comming from different database in a single table. If this is not what
you want, sorry :)
I would do that :
LOCK TABLE table1 WRITE, table2 WRITE
select @max_id:=max(id) FROM table1;
UPDATE table2 SET [EMAIL PROTECTED];
insert into table1(list of columns) select [list of columns] from
table2
UNLOCK
and then updating your FK within the update query.
Keep in mind that I didn't try with InnoDb tables... (but works fine
for
MyIsam)
-- Philippe Poelvoorde COS Trading Ltd.
-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
-- Philippe Poelvoorde COS Trading Ltd. +44.(0)20.7376.2401
-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]