Básicamente lo que necesitaba era poder sincronizar la estructura de dos bases de datos sin alterar los datos de ninguna de ellas, independientemente que una tuviera tablas que la otra no tuviese o que las tablas coincidentes tuvieran distinto numero de columnas.
Asi pues, os copio el codigo a continuacion:
- Código: Seleccionar todo
<?
$conectado=@mysql_connect("localhost","usuario","contraseña");
$BD_ORIGINAL='base de datos original';
$BD_SINCRONIZADA='base de datos destino';
$cif=$BD_SINCRONIZADA;
$sql = "SHOW TABLES FROM ".$BD_ORIGINAL;
$resultado = mysql_query($sql);
if (!$resultado) {
echo "Error de BD, no se pudieron listar las tablas\n";
echo 'Error MySQL: ' . mysql_error();
exit;
}
$crea_base="CREATE DATABASE IF NOT EXISTS ".mysql_real_escape_string($cif).";";
$hacer_base=mysql_query($crea_base,$conectado);
mysql_select_db($cif,$conectado);
while ($fila = mysql_fetch_row($resultado)) {
mysql_select_db($cif,$conectado);
$crea_tabla='CREATE TABLE '.mysql_real_escape_string($cif).'.'.$fila[0].' LIKE '.$BD_ORIGINAL.'.'.$fila[0].';';
$hacer_tabla=mysql_query($crea_tabla,$conectado);
mysql_select_db($BD_ORIGINAL,$conectado);
$sqlC = "SHOW COLUMNS FROM $fila[0]";
$resultadoC = mysql_query($sqlC);
while ($filaC = mysql_fetch_row($resultadoC)) {
$crea_tablaC='ALTER TABLE '.$cif.'.'.$fila[0].' ADD '.$filaC[0].' '.$filaC[1].' NOT NULL ;';
echo $crea_tablaC.'<br>';
$hacer_tablaC=mysql_query($crea_tablaC,$conectado);
}
mysql_free_result($resultadoC);
}
mysql_free_result($resultado);
?>
Ahora una breve explicacion del funcionamiento:
-Primero lee toda la estructura de la base de datos origen tabla por tabla (y la estructura de la tabla).
-Despues va creando las tablas una por una en la base de datos destino, que si no existe la crea y si existe trabajara sobre ella.
-Si una tabla ya existe en ambas bases de datos, leera la estructura de la tabla de la base de datos origen y añadira las columnas no coincidentes en la base de datos destino con el tipo de columna de la tabla de la base de datos origen.
Logicamente no se altera ninguno de los datos de ninguna de las bases de datos, ni el orden de las columnas preexistentes en cualquiera de las dos bases.