Mysql:以编程方式删除所有外键

时间:2009-08-10 02:08:55

标签: mysql foreign-keys

我现在正在使用一些有点笨拙的数据库,在所有错误的地方都定义了外键,我想将它们全部删除,然后从头开始。我不希望删除列,只删除外键关系。

如何从整个数据库中删除所有外键? (或按表格表)。

感谢。

编辑:忘了说,我可以使用PHPMyAdmin。

3 个答案:

答案 0 :(得分:7)

这是一个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();
?>

答案 1 :(得分:2)

我会使用工具以编程方式访问MySQL元数据。 JDBC,ODBC,MySQL的本机API或ADO.NET。从Metadata中提取所有现有外键。循环遍历所有这些并执行:

alter table INSERT_TABLE_NAME_HERE drop constraint INSERT_CONSTRAINT_NAME_HERE;

答案 2 :(得分:1)

我回答了另一个类似的问题(Is it possible to drop all foreign key constraints on a table at once in 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');