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 № 1Forse 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.