проверить, используется ли определенный идентификатор в качестве внешнего ключа в любой записи внешней таблицы - PullRequest
2 голосов
/ 01 октября 2011

у меня есть таблица '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уже упоминалось, было бы неплохо иметь все в одном запросе.но, насколько я понимаю, это невозможно ...

... или у вас есть предложения?

1 Ответ

0 голосов
/ 06 октября 2011

Нет способа сделать это на чистом SQL.Однако многие базы данных допускают выполнение «динамических» запросов с использованием их процедурных языков (таких как T-SQL, PL-SQL и т. Д.).Но на самом деле это просто еще один способ сделать то, что вы уже сделали в php.

Другая возможность, если у вас есть хорошие ограничения для всех этих внешних ключей, и они не каскадно удаляются, это сделать резервную копиюскопируйте строку, попытайтесь удалить ее и поймайте ошибку, которая произойдет, если это нарушение ограничения.Если ошибки нет, вы должны восстановить данные.Я думаю, что это просто теоретическая идея.

Наконец, вы можете вести активный подсчет ссылок или заранее написать запрос, зная об отношениях с внешним ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...