2013-02-18 3 views
1

У меня есть две таблицы a и a_history, как я могу определить, когда a был изменен, столбец удален или добавлен или изменен, а затем измените его на a_history.Получите различия между двумя таблицами?

a_history хранит запись о

a = (id,name,status) 

a_history = (id,name,status,id_history,operation,date_op,...) 

Например вы добавляете «код» VARCHAR в a, то a_history должен иметь «код» VARCHAR

Если изменить на «код» int в a, то a_history должен иметь «код» int, а не varchar

+0

взгляд в таблицу '' information_schema.columns' –

+1

TRIGGER's ..... –

ответ

1

Это сценарий, который я использую для сравнения Структура двух баз данных MySQL:

<?php 
//------------------------------------------------------------------------------ 
// Define the variables we'll be using. 
//------------------------------------------------------------------------------ 
$db1_con = NULL; 
$db1_constraints = array(); 
$db1_dbname = 'db1'; 
$db1_host = 'localhost'; 
$db1_password = 'password1'; 
$db1_tables = array(); 
$db1_username = 'username1'; 

$db2_con = NULL; 
$db2_constraints = array(); 
$db2_dbname = 'db2'; 
$db2_host = '123.123.123.123'; 
$db2_password = 'password2'; 
$db2_tables = array(); 
$db2_username = 'username2'; 

//------------------------------------------------------------------------------ 
// Connect to the databases. 
//------------------------------------------------------------------------------ 
try{ 
    $db1_con = new PDO("mysql:host=$db1_host;dbname=information_schema", $db1_username, $db1_password); 
    $db1_con->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); // Try to use the driver's native prepared statements. 
    $db1_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Let's use exceptions so we can try/catch errors. 
}catch(PDOException $e){ 
    echo "<p>Connection failed for $db1_host: " . $e->getMessage() . '</p>'; 
    exit; 
} 

try{ 
    $db2_con = new PDO("mysql:host=$db2_host;dbname=information_schema", $db2_username, $db2_password); 
    $db2_con->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); // Try to use the driver's native prepared statements. 
    $db2_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Let's use exceptions so we can try/catch errors. 
}catch(PDOException $e){ 
    echo "<p>Connection failed for $db2_host: " . $e->getMessage() . '</p>'; 
    exit; 
} 

if (NULL !== $db1_con && NULL !== $db2_con){ 
    echo "<h2>Column Analysis</h2>"; 
    $sql = 'SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? ORDER BY TABLE_NAME, ORDINAL_POSITION'; 
    $statement1 = $db1_con->prepare($sql); 
    $statement1->bindValue(1, $db1_dbname); 

    $statement2 = $db2_con->prepare($sql); 
    $statement2->bindValue(1, $db2_dbname); 

    if (TRUE === $statement1->execute()){ 
     while ($row = $statement1->fetch(PDO::FETCH_ASSOC)){ 
      $db1_tables[$row['TABLE_NAME']][$row['COLUMN_NAME']] = array(); 
      foreach ($row AS $key => $value){ 
       $db1_tables[$row['TABLE_NAME']][$row['COLUMN_NAME']][$key] = $value; 
      } 
     } 
    } 

    if (TRUE === $statement2->execute()){ 
     while ($row = $statement2->fetch(PDO::FETCH_ASSOC)){ 
      $db2_tables[$row['TABLE_NAME']][$row['COLUMN_NAME']] = array(); 
      foreach ($row AS $key => $value){ 
       $db2_tables[$row['TABLE_NAME']][$row['COLUMN_NAME']][$key] = $value; 
      } 
     } 
    } 

    foreach ($db1_tables AS $table => $info){ 
     if (!isset($db2_tables[$table])){ 
      echo "<p>Table <strong>$table</strong> does not exist in the SECOND database!</p>"; 
     }else{ 
      foreach ($info AS $column => $data){ 
       if (!isset($db2_tables[$table][$column])){ 
        echo "<p>Column <strong>$column</strong> does not exist in table <strong>$table</strong> in the SECOND database!</p>"; 
       }else{ 
        if (count($data)){ 
         foreach ($data AS $key => $value){ 
          if ($db1_tables[$table][$column][$key] !== $db2_tables[$table][$column][$key]){ 
           echo "<p>Column <strong>$column</strong> in table <strong>$table</strong> has differing characteristics for <strong>$key</strong> (". $db1_tables[$table][$column][$key] ." vs. ". $db2_tables[$table][$column][$key] .")</p>"; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    foreach ($db2_tables AS $table => $info){ 
     if (!isset($db1_tables[$table])){ 
      echo "<p>Table <strong>$table</strong> does not exist in the FIRST database!</p>"; 
     }else{ 
      foreach ($info AS $column => $data){ 
       if (!isset($db1_tables[$table][$column])){ 
        echo "<p>Column <strong>$column</strong> does not exist in table <strong>$table</strong> in the FIRST database!</p>"; 
       }else{ 
        if (count($data)){ 
         foreach ($data AS $key => $value){ 
          if ($db2_tables[$table][$column][$key] !== $db1_tables[$table][$column][$key]){ 
           echo "<p>Column <strong>$column</strong> in table <strong>$table</strong> has differing characteristics for <strong>$key</strong> (". $db2_tables[$table][$column][$key] ." vs. ". $db1_tables[$table][$column][$key] .")</p>"; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    echo "<h2>Constraint Analysis</h2>"; 

    $sql = 'SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = ? ORDER BY TABLE_NAME, ORDINAL_POSITION'; 
    $statement1 = $db1_con->prepare($sql); 
    $statement1->bindValue(1, $db1_dbname); 

    $statement2 = $db2_con->prepare($sql); 
    $statement2->bindValue(1, $db2_dbname); 

    if (TRUE === $statement1->execute()){ 
     while ($row = $statement1->fetch(PDO::FETCH_ASSOC)){ 
      foreach ($row AS $key => $value){ 
       $db1_constraints[$row['TABLE_NAME']][$row['COLUMN_NAME']][$key] = $value; 
      } 
     } 
    } 

    if (TRUE === $statement2->execute()){ 
     while ($row = $statement2->fetch(PDO::FETCH_ASSOC)){ 
      foreach ($row AS $key => $value){ 
       $db2_constraints[$row['TABLE_NAME']][$row['COLUMN_NAME']][$key] = $value; 
      } 
     } 
    } 

    foreach ($db1_constraints AS $table => $info){ 
     foreach ($info AS $column => $data){ 
      if (isset($db2_constraints[$table][$column])){ 
       if (count($data)){ 
        foreach ($data AS $key => $value){ 
         if ('CONSTRAINT_NAME' !== $key && $db1_constraints[$table][$column][$key] !== $db2_constraints[$table][$column][$key]){ 
          echo "<p>Column <strong>$column</strong> in table <strong>$table</strong> has differing characteristics for <strong>$key</strong> (". $db1_constraints[$table][$column][$key] ." vs. ". $db2_constraints[$table][$column][$key] .")</p>"; 
         } 
        } 
       } 
      }else{ 
       echo "<p>Column <strong>$column</strong> in table <strong>$table</strong> is missing a constraint in the SECOND database!</p>"; 
      } 
     } 
    } 

    foreach ($db2_constraints AS $table => $info){ 
     foreach ($info AS $column => $data){ 
      if (isset($db1_constraints[$table][$column])){ 
       if (count($data)){ 
        foreach ($data AS $key => $value){ 
         if ('CONSTRAINT_NAME' !== $key && $db2_constraints[$table][$column][$key] !== $db1_constraints[$table][$column][$key]){ 
          echo "<p>Column <strong>$column</strong> in table <strong>$table</strong> has differing characteristics for <strong>$key</strong> (". $db2_constraints[$table][$column][$key] ." vs. ". $db1_constraints[$table][$column][$key] .")</p>"; 
         } 
        } 
       } 
      }else{ 
       echo "<p>Column <strong>$column</strong> in table <strong>$table</strong> is missing a constraint in the FIRST database!</p>"; 
      } 
     } 
    } 
} 
?> 
Смежные вопросы