sql >> データベース >  >> RDS >> Mysql

2つのテーブルの違いを取得しますか?

    これは、2つの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>";
                }
            }
        }
    }
    ?>
    



    1. Wiresharkを使用してmysqlクエリSQLを明確にキャプチャする方法

    2. SQLite Upper()のしくみ

    3. 列名をフェッチするOracleクエリ

    4. OracleDBに最後に挿入されたレコードのIDを取得します