/ / Elimina tutti i vincoli di tabella in MySQL - mysql, database, vincoli

Eliminare tutti i vincoli di tabella in MySQL - mysql, database, vincoli

La mia domanda è come cancellare o rimuovere tutto ilvincoli definiti su una tabella nel database MySQL in una sola volta. Esiste un modo per farlo con una singola LOC o dobbiamo scrivere istruzioni per rimuovere ogni tipo di vincolo individualmente. Qualcuno può aiutarmi. Anche una piccola sceneggiatura diventerebbe troppo noiosa per ricordare tutti i nomi dei vincoli per una tabella e quindi rimuoverli. Grazie.

risposte:

0 per risposta № 1

Forse stai ancora cercando una risposta dopo il 3anni. Probabilmente no, ma qui c'è una procedura per rimuovere tutti i vincoli di tabella (primaria, chiave esterna, unica, controllo). Rimuove anche auto_increment e NOT NULL dalle colonne.

Questo codice è fornito così com'è e dovrebbe essere considerato molto pericoloso in quanto modificherà molte colonne e tabelle:

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 ;

Per utilizzare questa procedura, è sufficiente eseguire:

call dropAllConstraintsForAllTablesInSchema("table_schema");

Ancora una volta, usa la tua stessa cautela. Potrebbe avere effetti collaterali non testati sulle definizioni delle colonne.