У меня есть следующий код:
$fkQuery = "SELECT TABLE_CONSTRAINTS.TABLE_NAME, KEY_COLUMN_USAGE.COLUMN_NAME, KEY_COLUMN_USAGE.REFERENCED_TABLE_NAME, KEY_COLUMN_USAGE.REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS RIGHT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ON INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME = INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME <> 'PRIMARY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_SCHEMA = '".$dbName."';";
$fkQueryResult = $newLink->query($fkQuery);
$a = 0;
while($fkey = $fkQueryResult->fetch(PDO::FETCH_ASSOC))
{
$testF[] = $fkey;
$assocF = $testF[$a];
$newTableName = $assocF['TABLE_NAME'];
$newColumnName = $assocF['COLUMN_NAME'];
$newRefTableName = $assocF['REFERENCED_TABLE_NAME'];
$newRefColumnName = $assocF['REFERENCED_COLUMN_NAME'];
$addFkToTable = "ALTER TABLE " . $newDbName . "." . $newTableName . " ADD FOREIGN KEY (" . $newColumnName . ") REFERENCES " . $dbName . "." . $newRefTableName . "(" . $newRefColumnName . ");";
echo $addFkToTable . "\n";
$newLink->query($addFkToTable);
$a++;
}
Это выберет все ссылки на внешние ключи из старой таблицы в старой базе данных, чтобы они могли быть переданы в новую таблицу базы данных. Это работает, за исключением того, что удваивает каждое отношение внешнего ключа. Так, например, у меня есть TableA (columnA), которая ссылается на TableB (columnB). Когда я запускаю fkQuery для базы данных, он возвращает, что fk существует, но перечисляет его дважды. Любые предложения относительно того, как это исправить?
Задача ещё не решена.
Других решений пока нет …