我的问题是我们如何一次删除或删除MySQL数据库中表上定义的所有约束。是否有任何可能的方法使用单个LOC或我们必须编写指令以单独删除每种类型的约束。任何人都可以帮助我。一个小脚本也会因为记住表的所有约束名称然后将它们删除而变得太繁琐。感谢。
答案 0 :(得分: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');
再次,请谨慎使用。它可能会对您的列定义产生一些未经测试的副作用。