2012-10-04 18 views
6

Nota: Disculpa si se trata de un duplicado pero no puedo encontrar una solución.mySQL - Copie las filas de una base de datos a otra con identificadores automáticos de incremento

Tengo dos bases de datos (una de desarrollo y una en vivo) que tienen exactamente el mismo esquema.

Para facilitar la explicación, supongo que tengo una tabla de "cliente" y una tabla de "presupuesto". Ambas tablas tienen identificadores de incremento automático y la tabla de cotización tiene una columna 'customerid' que sirve como clave externa para la tabla de clientes.

Mi problema es que tengo algunas filas en mi base de datos de desarrollo que quiero copiar a la base de datos en vivo. Cuando copio las filas de los clientes, puedo obtener fácilmente una nueva identificación, pero ¿cómo puedo asignar la nueva identificación a las filas de la tabla de citas 'hijo'?

Sé que puedo escribir manualmente inserciones para solucionar el problema, pero ¿hay alguna manera más fácil de hacerlo?

EDIT: Este es un ejemplo simplificado, tengo alrededor de 15 tablas, todas las cuales forman una jerarquía usando incrementos automáticos y claves foráneas. Hay muchos más datos en la base de datos en vivo para los nuevos ID será más grande (por ejemplo dev.customer.id = 4, live.customer.id = 54)

Respuesta

3

finalmente logré hacer esto (como por mi comentario) pero con el fin de hacer así que tuve que escribir código. Al final creé algunas tablas ficticias que realizaban un seguimiento de la antigua identificación contra nueva identificación. Al copiar registros con restricciones FK, busqué la nueva identificación basada en la anterior. Un poco largo sin aliento, pero funcionó.

Esta publicación está empezando ahora, así que la he marcado como la respuesta. Si alguien tiene mejores ideas/soluciones que funcionen, felizmente lo desmarcaré como la respuesta aceptada.

EDITAR: Según lo solicitado aquí hay algún pseudo-código que espero explique cómo lo hice.

que tienen las dos tablas relacionadas de la siguiente manera:

CREATE TABLE tblCustomers (
    Id int NOT NULL AUTO_INCREMENT, 
    Name varchar(50) DEFAULT NULL, 
    Address varchar(255) DEFAULT NULL, 
    PRIMARY KEY (Id) 
) 
ENGINE = MYISAM 
ROW_FORMAT = fixed; 

CREATE TABLE tblQuotes (
    Id int NOT NULL AUTO_INCREMENT, 
    CustomerId int(11) DEFAULT NULL, 
    QuoteReference varchar(50) DEFAULT NULL, 
    PRIMARY KEY (Id) 
) 
ENGINE = MYISAM 
ROW_FORMAT = fixed; 

puedo crear una tabla adicional que voy a utilizar para realizar un seguimiento de los identificadores de viejos contra los nuevos identificadores de

CREATE TABLE tblLookupId (
    Id int NOT NULL AUTO_INCREMENT, 
    TableName varchar(50) DEFAULT NULL, 
    OldId int DEFAULT NULL, 
    NewId int DEFAULT NULL, 
    PRIMARY KEY (Id) 
) 
ENGINE = MYISAM 
ROW_FORMAT = fixed; 

La idea es que copio el tblCustomer filas uno a la vez y realizar un seguimiento de los identificadores como voy, así:

// copy each customer row from dev to live and track each old and new id 
// 
foreach (customer in tblCustomers) 
{ 
    // track the old id 
    var oldid = customer.id; // e.g. 1 

    // insert the new record into the target database 
    INSERT newdb.tblCustomers (...) VALUES (...); 

    // get the new id 
    var newid = SELECT LAST_INSERT_ID() // e.g. 245 

    // insert the old id and the new id in the id lookup table 
    INSERT idlookup (TableName, OldId, NewId) VALUES ('tblCustomers', oldid, newid); // this maps 1->245 for tblCustomers 
} 

Cuando voy a copiar el t able (tblQuote) con la clave externa Tengo que buscar primero la nueva identificación basada en la anterior.

// copy each quote row from dev to live and lookup the foreign key (customer) from the lookup table 
// 
foreach(quote in tblQuotes) 
{ 
    // get the old foreign key value 
    var oldcustomerid = quote.CustomerId; // e.g 1 

    // lookup the new value 
    var newcustomerid = SELECT newid FROM tblIdLookup WHERE TableName='tblCustomers' AND oldid=oldcustomerid; // returns 245 

    // insert the quote record 
    INSERT tblQuotes (CustomerId, ...) VALUES (newcustomerid, ...); 
} 

He tratado de mantener este corto y al punto (y el idioma agnóstico) lo que la técnica puede ser visto. En mi situación real, tenía alrededor de 15 tablas en cascada, así que tuve que rastrear los nuevos identificadores de cada tabla no solo tblCustomer

+0

¿Podría ser más específico sobre lo que hizo para resolver esto? Sé que ha pasado un tiempo, pero esta es una gran pregunta, y una respuesta completa sería genial. – kittykittybangbang

+0

@kittykittybangbang He agregado un pseudocódigo que espero explique esta técnica. Lo he hecho varias veces, no es rápido ni bonito, pero funciona como un hechizo. –

+0

¡Muchas gracias! :RE – kittykittybangbang

0

Uso INSERT ... SELECT:

insert into your_table (c1, c2, ...) 
select c1, c2, ... 
from your_table 

donde c1, c2, ... son todas las columnas excepto id.

+0

Esto funcionará para la primera tabla (cliente) pero ¿qué pasa con la segunda (cita)? –

+0

probablemente una consulta anidada entre comillas, obteniendo la identificación correcta del cliente – Anshu

+0

Gracias, parece que vamos en la dirección correcta. ¿Alguna posibilidad de que puedas dar un ejemplo? –

10

manera más fácil sin cambiar ningún código de

INSERT INTO to_database.to_table SELECT * FROM from_database WHERE some_id = 123; 

hay necesidad de especificar las columnas si no hay necesidad de reasignar cualquier cosa.

Espero que ayude ...

+1

que está bien para una sola tabla, pero tengo una jerarquía de tablas con restricciones FK. Como dije, sé que se puede escribir manualmente. –

+1

Vale la pena mencionar que desde entonces he superado esto creando tablas intermedias sin incrementos automáticos, sino GUID en su lugar y luego mapeo de tablas para proporcionar una búsqueda del Id 'anterior' de cada registro en cada tabla. –

+1

Útil sí, pero necesita una corrección: necesitaremos estar en la base de datos from_ ('use from_database') cuando ejecutemos esta consulta, pero dentro de la consulta debería decir' from_table' donde dice 'from_database'. –

Cuestiones relacionadas