/ / Usuń wszystkie ograniczenia tabeli w MySQL - mysql, baza danych, ograniczenia

Zrzuć wszystkie ograniczenia tabel w MySQL - mysql, database, constraints

Moje pytanie brzmi: w jaki sposób usuwamy lub usuwamy wszystkieograniczenia zdefiniowane w tabeli w bazie danych MySQL za jednym razem. Czy jest jakiś możliwy sposób, aby to zrobić za pomocą pojedynczego LOC, czy też musimy napisać instrukcję, aby usunąć każdy typ ograniczenia osobno. Czy ktoś mógłby mi pomóc. Mały skrypt też byłby zbyt nudny, aby zapamiętać wszystkie nazwy ograniczeń dla tabeli, a następnie je usunąć. Dzięki.

Odpowiedzi:

0 dla odpowiedzi № 1

Być może nadal szukasz odpowiedzi po 3lat Prawdopodobnie nie, ale oto procedura usuwania wszystkich ograniczeń tabeli (podstawowy, klucz obcy, unikatowy, sprawdź). Usuwa także auto_increment i NOT NULL z kolumn.

Ten kod jest dostarczany w stanie „jak jest” i należy go uważać za bardzo niebezpieczny, ponieważ zmodyfikuje wiele kolumn i tabel:

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 ;

Aby skorzystać z tej procedury, po prostu uruchom:

call dropAllConstraintsForAllTablesInSchema("table_schema");

Ponownie używaj na własną ostrożność. Może mieć pewne niesprawdzone skutki uboczne w definicjach kolumn.