Mysql: программно удалить все внешние ключи - PullRequest
2 голосов
/ 10 августа 2009

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

Как удалить все внешние ключи из всей базы данных? (Или таблица за столом).

Спасибо.

Редактировать: Забыл сказать, у меня есть PHPMyAdmin для использования.

Ответы [ 3 ]

7 голосов
/ 09 июня 2010

Вот PHP-скрипт для циклического просмотра таблицы information_schema.key_column_usage и удаления каждого внешнего ключа:

<?php
$DBNAME = 'dbname';
mysql_connect('localhost', 'username', 'password');

mysql_select_db($DBNAME);
$result = mysql_query("SELECT DISTINCT table_name, constraint_name"
  . " FROM information_schema.key_column_usage"
  . " WHERE constraint_schema = '$DBNAME'"
  . " AND referenced_table_name IS NOT NULL");
while($row = mysql_fetch_assoc($result)) {
  mysql_query("ALTER TABLE `$row[table_name]`"
    . " DROP FOREIGN KEY `$row[constraint_name]`")
    or die(mysql_error());
}
mysql_free_result($result);
mysql_close();
?>
2 голосов
/ 10 августа 2009

Я бы использовал инструмент для доступа к метаданным MySQL программно. JDBC, ODBC, собственный API MySQL или ADO.NET. Из метаданных извлекаются все существующие внешние ключи. Переберите их все и выполните:

alter table INSERT_TABLE_NAME_HERE drop constraint INSERT_CONSTRAINT_NAME_HERE;
1 голос
/ 23 мая 2013

Я ответил на другой похожий вопрос ( Возможно ли сразу исключить все ограничения внешнего ключа для таблицы в mySQL 5? ), но подумал, что стоит включить ответ здесь.

Это решение чисто в mysql, создавая процедуру для обхода ограничений таблицы и удаления их по одному за раз.

DROP PROCEDURE IF EXISTS dropForeignKeysFromTable;

delimiter ///
create procedure dropForeignKeysFromTable(IN param_table_schema varchar(255), IN param_table_name varchar(255))
begin
    declare done int default FALSE;
    declare dropCommand varchar(255);
    declare dropCur cursor for 
        select concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name, ';') 
        from information_schema.table_constraints
        where constraint_type='FOREIGN KEY' 
            and table_name = param_table_name
            and table_schema = param_table_schema;

    declare continue handler for not found set done = true;

    open dropCur;

    read_loop: loop
        fetch dropCur into dropCommand;
        if done then
            leave read_loop;
        end if;

        set @sdropCommand = dropCommand;

        prepare dropClientUpdateKeyStmt from @sdropCommand;

        execute dropClientUpdateKeyStmt;

        deallocate prepare dropClientUpdateKeyStmt;
    end loop;

    close dropCur;
end///

delimiter ;

Чтобы использовать процедуру для одной из ваших таблиц, просто используйте следующее, заменив table_schema и table_name на ваши значения:

call dropForeignKeysFromTable('table_schema', 'table_name');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...