私の質問は、どのようにしてすべてを削除または削除するかですMySQLデータベースのテーブルに一度に定義された制約。単一のLOCでそれを行うための可能な方法はありますか、それとも各タイプの制約を個別に削除する命令を作成する必要がありますか?誰かが私を助けてくれませんか。小さなスクリプトでも、テーブルのすべての制約名を覚えてから削除するのが面倒になるため、そうなります。ありがとう。
回答:
回答№1は0多分あなたは」まだ3の後の答えを探しています年。おそらくそうではありませんが、ここでは、すべてのテーブル制約(プライマリ、外部キー、一意、チェック)を削除する手順を示します。また、列からauto_incrementとNOTNULLを削除します。
このコードは現状のまま提供され、多くの列とテーブルを変更するため、非常に危険であると見なす必要があります。
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");
繰り返しますが、ご自身の注意で使用してください。列定義にテストされていない副作用がある可能性があります。