1

我的问题是我们如何一次删除或删除在 MySQL 数据库中的表上定义的所有约束。是否有任何可能的方法可以使用单个 LOC 来完成,或者我们是否必须编写指令来单独删除每种类型的约束。谁能帮帮我。一个小脚本也会因为记住一个表的所有约束名称然后删除它们变得太乏味了。谢谢。

4

1 回答 1

1

也许三年后您仍在寻找答案。可能不是,但这里有一个删除所有表约束(主键、外键、唯一键、检查)的过程。它还从列中删除 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');

再次,请谨慎使用。它可能会对您的列定义产生一些未经测试的副作用。

于 2017-03-02T17:53:29.830 回答