private function BuildForeignKeys(IConnection $Connection, array $Columns, $DatabaseName, $TableName, array &$LoadedTables)
{
$ForeignKeys = [];
$QueryBuilder = $Connection->QueryBuilder();
$QueryBuilder->Append('SELECT C.*, R.`UPDATE_RULE`, R.`DELETE_RULE` FROM ');
$QueryBuilder->Append('`INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` C ');
$QueryBuilder->Append('INNER JOIN ');
$QueryBuilder->Append('`INFORMATION_SCHEMA`.`REFERENTIAL_CONSTRAINTS` R ');
$QueryBuilder->Append('ON C.`CONSTRAINT_NAME` = R.`CONSTRAINT_NAME` ');
$QueryBuilder->Append('AND C.`TABLE_SCHEMA` = R.`CONSTRAINT_SCHEMA` ');
$QueryBuilder->Append('AND C.`TABLE_NAME` = R.`TABLE_NAME` ');
$QueryBuilder->Append('WHERE TRUE ');
$QueryBuilder->AppendValue('AND C.`REFERENCED_TABLE_SCHEMA` = # ', $DatabaseName);
$QueryBuilder->Append('AND C.`REFERENCED_TABLE_NAME` IS NOT NULL ');
$QueryBuilder->Append('AND C.`REFERENCED_COLUMN_NAME` IS NOT NULL ');
$QueryBuilder->AppendValue('AND C.`TABLE_SCHEMA` = # ', $DatabaseName);
$QueryBuilder->AppendValue('AND C.`TABLE_NAME` = # ', $TableName);
$ForeignKeyRowGroups = $this->GroupColumnsByKey($QueryBuilder->Build()->Execute()->FetchAll(), 'CONSTRAINT_NAME');
foreach ($ForeignKeyRowGroups as $ForeignKeyRows) {
$ForeignKeys[] = $this->BuildForeignKey($Connection, $DatabaseName, $Columns, $ForeignKeyRows, $LoadedTables);
}
return $ForeignKeys;
}