我正在處理一點數據庫,此時在所有地方的所有錯誤地方都定義了外鍵,我想將它們全部刪除,然後白手起家。我不想刪除列,只是外鍵關係。Mysql:以編程方式刪除所有外鍵
如何從整個數據庫中刪除所有外鍵? (或按表格)。
謝謝。
編輯:忘了說,我有PHPMyAdmin可供使用。
我正在處理一點數據庫,此時在所有地方的所有錯誤地方都定義了外鍵,我想將它們全部刪除,然後白手起家。我不想刪除列,只是外鍵關係。Mysql:以編程方式刪除所有外鍵
如何從整個數據庫中刪除所有外鍵? (或按表格)。
謝謝。
編輯:忘了說,我有PHPMyAdmin可供使用。
我會使用一種工具以編程方式訪問MySQL元數據。 JDBC,ODBC,MySQL的本地API或ADO.NET。從元數據中提取所有現有的外鍵。遍歷所有這些,執行:
alter table INSERT_TABLE_NAME_HERE drop constraint INSERT_CONSTRAINT_NAME_HERE;
這裏是通過information_schema.key_column_usage表中的PHP腳本中循環,並丟棄每個外鍵:
<?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();
?>
我回答了另一個類似的問題(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和表名:
call dropForeignKeysFromTable('table_schema', 'table_name');
請問這種做法總是工作?或者你可能會遇到依賴於其他人的FOREIGN KEY?剛剛在Groovy中針對MySQL數據庫嘗試了這種方法,並遇到一些錯誤,告訴我的語法錯誤。很奇怪。 – BuddyJoe 2011-07-13 02:23:27
@tyndall:如果錯誤提示您的語法錯誤,那麼這意味着數據庫甚至沒有嘗試執行任何操作。你最好的選擇是首先解決語法錯誤。 – 2011-07-13 05:53:04
仍然不確定問題出在哪裏......我一次只能拿一條線並在數據庫上運行。但以分號結尾的完整列表將不會運行。我無法按照information_schema.key_column_usage查詢中的順序運行它們。我們會做更多的研究,看看這個週末是否有依賴的外鍵。我將重新創建數據庫並重試。 – BuddyJoe 2011-07-13 16:33:56