2009-08-10 16 views
2

Je travaille avec un peu de base de données dodgey pour le moment, il y a des clés étrangères définies dans tous les mauvais endroits un peu partout, je voudrais tous les supprimer et ensuite commencer à partir de zéro. Je ne souhaite pas supprimer la colonne, mais uniquement les relations de clé étrangère. Comment puis-je supprimer toutes les clés étrangères d'une base de données entière? (Ou table par table).Mysql: supprimer par programme toutes les clés étrangères

Merci.

Modifier: J'ai oublié de dire, j'ai PHPMyAdmin à votre disposition.

Répondre

2

J'utiliserais un outil pour accéder aux métadonnées MySQL par programme. JDBC, ODBC, l'API native de MySQL ou ADO.NET. A partir des métadonnées, extrayez toutes les clés étrangères existantes. Boucle à travers tous et exécuter:

alter table INSERT_TABLE_NAME_HERE drop constraint INSERT_CONSTRAINT_NAME_HERE; 
7

Voici un script PHP à boucle à travers la table information_schema.key_column_usage et déposez chaque clé étrangère:

<?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(); 
?> 
+0

Est-ce que cette approche fonctionne toujours? ou pourriez-vous éventuellement rencontrer des clés étrangères qui dépendent des autres? Juste essayé cette approche dans Groovy contre une base de données MySQL et a rencontré une erreur en disant que ma syntaxe était erronée. très étrange. – BuddyJoe

+0

@tyndall: Si l'erreur indique que votre syntaxe est incorrecte, cela signifie que la base de données n'a même pas encore tenté d'effectuer une opération. Votre meilleur pari est de corriger l'erreur de syntaxe en premier. –

+0

Je ne sais toujours pas quel était le problème ... J'ai été capable de prendre une ligne à la fois et de l'exécuter sur la base de données. Mais la liste complète avec des points-virgules comme des fins de ligne ne fonctionnerait pas. Et je n'ai pas pu les exécuter dans l'ordre qui sort de la requête information_schema.key_column_usage. Fera d'autres recherches pour voir s'il y a des clés étrangères dépendantes ce week-end. Je vais recréer la base de données et réessayer. – BuddyJoe

1

répondis-je une autre question similaire (Is it possible to drop all foreign key constraints on a table at once in mySQL 5?), mais pensé qu'il pourrait être utile d'inclure la réponse ici.

Cette solution est purement mysql en créant une procédure pour faire une boucle sur les contraintes de la table et les déposer une à la fois.

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 ; 

Pour utiliser la procédure sur l'un de vos tables il suffit d'utiliser les éléments suivants, en remplacement table_schema et nom_de_table vos valeurs:

call dropForeignKeysFromTable('table_schema', 'table_name'); 
Questions connexes