2013-06-12 53 views
1

我的问题是我们如何删除或删除在MySQL数据库中的表中定义的所有约束。是否有任何可能的方法用单个LOC来完成,或者我们是否需要编写指令来单独去除每种类型的约束。任何人都可以帮助我。一个小脚本也会因为忘记表格的所有约束名称然后将其删除而变得过于繁琐。谢谢。删除MySQL中的所有表限制

+0

也许这篇文章有你需要的解决方案吗? http://stackoverflow.com/questions/1323462/is-it-possible-to-drop-all-foreign-key-constraints-on-a-table-at-once-in-mysql-5 – StaticVoid

回答

0

也许您在3年后仍在寻找答案。可能不会,但是这是一个删除所有表约束(主键,外键,唯一性,检查)的过程。它还从列中删除auto_increment和NOT NULL。

提供此代码不变并应被视为高度危险的,因为它会改变很多列和表:

DROP PROCEDURE IF EXISTS dropAllConstraintsForAllTablesInSchema; 

DELIMITER /// 
CREATE PROCEDURE dropAllConstraintsForAllTablesInSchema(IN param_table_schema VARCHAR(255)) 
    BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE dropCommand VARCHAR(255); 
    DECLARE dropCur CURSOR FOR 
     SELECT 
      concat('alter table ', table_schema, '.', table_name, ' MODIFY ', column_name, ' ', column_type, ' ', replace(extra, 'auto_increment', ''), ';') 
     FROM information_schema.COLUMNS 
     WHERE table_schema = param_table_schema 
      AND (IS_NULLABLE = FALSE OR EXTRA REGEXP 'auto_increment') 
     UNION 
     SELECT CASE constraint_type 
      WHEN 'FOREIGN KEY' 
       THEN concat('alter table ', table_schema, '.', table_name, ' DROP FOREIGN KEY ', constraint_name, ';') 
      WHEN 'UNIQUE' 
       THEN concat('alter table ', table_schema, '.', table_name, ' DROP INDEX ', constraint_name, ';') 
      WHEN 'PRIMARY KEY' 
       THEN concat('alter table ', table_schema, '.', table_name, ' DROP PRIMARY KEY;') 
      WHEN 'CHECK' 
       THEN concat('alter table ', table_schema, '.', table_name, ' DROP CHECK ', constraint_name, ';') 
      END 
     FROM information_schema.table_constraints 
     WHERE constraint_type IN ('FOREIGN KEY', 'UNIQUE', 'PRIMARY KEY', 'CHECK') 
      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 ; 

要使用这个程序,只需运行:

call dropAllConstraintsForAllTablesInSchema('table_schema'); 

再次,请谨慎使用。它可能会对列定义有一些未经检验的副作用。