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