我现在正在使用一些有点笨拙的数据库,在所有错误的地方都定义了外键,我想将它们全部删除,然后从头开始。我不希望删除列,只删除外键关系。
如何从整个数据库中删除所有外键? (或按表格表)。
感谢。
编辑:忘了说,我可以使用PHPMyAdmin。
答案 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');