type - Variables de MySQL en la secuencia de comandos ALTER TABLE
comando para modificar una base de datos en mysql (1)
Con el uso de variables como nombres de columna y tablas, sería mejor DECLARE
una consulta como una "cadena" y luego ejecutarla a través de una Prepared Statement
.
Esto se puede hacer de dos maneras, ya sea mediante CONCAT()
para construir la cadena completa o mediante PREPARE
con argumentos:
SET @query = CONCAT(''ALTER TABLE '', var_referenced_table_name, '' DROP FOREIGN KEY '', var_constraint_name, '';'');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Hola El siguiente procedimiento tendrá que mover todas las restricciones de una tabla a la otra, sin embargo, tengo algunas dificultades en el punto donde la restricción debe ser eliminada.
El problema: cómo uso las variables en la siguiente línea
ALTER TABLE var_referenced_table_name DROP FOREIGN KEY var_constraint_name;
cuando uso como es, recibo el siguiente error
Error Code: 1146. Table ''oaf_businesslink_dev.var_referenced_table_name'' doesn''t exist
MySQL no reconoce var_referenced_table_name
y var_constraint_name
como variables.
DELIMITER //
DROP PROCEDURE IF EXISTS AlterConstraints//
CREATE PROCEDURE AlterConstraints()
BEGIN
DECLARE schema_name VARCHAR(60) DEFAULT ''oaf_businesslink_dev'';
DECLARE table_name VARCHAR(60) DEFAULT ''wp_systemuser'';
DECLARE finished INTEGER DEFAULT 0;
DECLARE total INTEGER DEFAULT 0;
DECLARE var_constraint_name VARCHAR(60) DEFAULT '''';
DECLARE var_table_name VARCHAR(60) DEFAULT '''';
DECLARE var_column_name VARCHAR(60) DEFAULT '''';
DECLARE var_referenced_table_name VARCHAR(60) DEFAULT '''';
DECLARE var_referenced_column_name VARCHAR(60) DEFAULT '''';
DECLARE cur_constraints CURSOR FOR SELECT constraint_Name, table_name,column_name,referenced_table_name,referenced_column_name
FROM information_schema.key_column_usage
WHERE constraint_schema = schema_name
AND referenced_table_name = table_name
AND table_name IS NOT NULL;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
OPEN cur_constraints;
get_constraint:
LOOP FETCH cur_constraints
INTO var_constraint_name
,var_table_name
,var_column_name
,var_referenced_table_name
,var_referenced_column_name;
IF finished THEN
LEAVE get_constraint;
END IF;
/* Get Constraint Count */
SET total = total + 1;
/* Remove Constraint */
IF EXISTS(SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME = var_constraint_name AND TABLE_NAME = var_referenced_table_name AND TABLE_SCHEMA = schema_name)
THEN
/*
* Error Code: 1146. Table ''oaf_businesslink_dev.var_referenced_table_name'' doesn''t exist
*/
ALTER TABLE var_referenced_table_name DROP FOREIGN KEY var_constraint_name;
END IF;
/* Change Datatype to BIGINT */
/* Recreate Constraint to new table */
END
LOOP get_constraint;
CLOSE cur_constraints;
SELECT total;
END
//
DELIMITER ;
CALL AlterConstraints();
Gracias por adelantado.