у меня есть таблица 'users' с колонкой 'id'.этот идентификатор используется в качестве внешнего ключа во многих других таблицах (например, сообщениях, комментариях и т. д.).
Я хочу выяснить, есть ли какие-либо ссылки на идентификатор конкретного пользователя в каких-либо внешних таблицах.
это дает мне все имена таблиц и имен столбцов, где столбец 'id' из таблицы 'users' используется в качестве внешнего ключа:
SELECT table_name,column_name
FROM information_schema.key_column_usage
WHERE referenced_table_name = 'users';
сейчас, как я могу проверить, если мойконкретный идентификатор пользователя используется в качестве внешнего ключа в одной из этих таблиц / столбцов в результате - и объединить этот тест с кодом SQL выше, чтобы получить один запрос?
Я нашел решение и добавилСледующая функция для моего класса базы данных php:
/**
* isKeyUsedAsForeignKey
*
* returns true if the $key from column 'id' in $table is used as foreign key in other tables and there are one or more entries in one or more of this foreign tables with $key from $table in the respective foreign key column
*
* @param string $table table name
* @param int $key entry id
* @return bool
*/
public function isKeyUsedAsForeignKey( $table, $key ) {
$key = intval($key);
if( preg_match('/^[-_a-z0-9]+$/i',$table) && $key>0 ) {
$result = $this->query("SELECT table_name,column_name FROM information_schema.key_column_usage WHERE referenced_table_name = '".$table."'");
$select = array();
while( $result && $row=$result->fetch_assoc() )
array_push($select,"(SELECT COUNT(DISTINCT ".$row['column_name'].") FROM ".$row['table_name']." WHERE ".$row['column_name']."='".$key."') AS ".$row['table_name']);
$result2 = $this->query("SELECT ".implode(',',$select));
if( $result2 && $row=$result2->fetch_row() )
return array_sum($row)>0 ? true : false;
}
return false;
}
Теперь я могу запустить следующий тест, чтобы определить, используется ли id 3 из 'users' в качестве внешнего ключа:
$db->isKeyUsedAsForeignKey('users',3)
As iуже упоминалось, было бы неплохо иметь все в одном запросе.но, насколько я понимаю, это невозможно ...
... или у вас есть предложения?