Nos podemos encontrar que un campo diseñado para un valor excede al final del valor que finalmente debe llevar. O que incluso hemos puesto un tipo de datos diferente o mas pequeño y debemos realizar el cambio.
Si esto es solo en una o dos tablas, no es demasiado problema hacerlo manual.
Si por el contrario, necesitas cambiarlo en varias tablas, este script te puede servir.
Devuelve un resultado, una query con todos los ALTER TABLE
necesarios para cambiar un tipo a otro en una base de datos.
CREATE PROCEDURE `changeType`
OPEN cursor1;
BEGIN
DECLARE v_done INT DEFAULT 0;
DECLARE v_table VARCHAR(50);
DECLARE v_database VARCHAR(20) DEFAULT '*******';
DECLARE v_column VARCHAR(50);
DECLARE v_length INTEGER(11);
DECLARE v_oldtype VARCHAR(20) DEFAULT 'smallint';
DECLARE v_newtype VARCHAR(20) DEFAULT 'int';
DECLARE v_text TEXT;
DECLARE cursor1 CURSOR FOR SELECT t.TABLE_NAME, t.COLUMN_NAME, substr(t.COLUMN_TYPE,instr(t.COLUMN_TYPE,"(") + 1, instr(t.COLUMN_TYPE,")") - instr(t.COLUMN_TYPE,"(") - 1) longitud
FROM INFORMATION_SCHEMA.COLUMNS t
WHERE t.TABLE_SCHEMA = v_database and t.DATA_TYPE = v_oldtype AND substr(t.COLUMN_TYPE,instr(t.COLUMN_TYPE,"(") + 1, instr(t.COLUMN_TYPE,")") - instr(t.COLUMN_TYPE,"(") - 1) > 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
SET v_text = “”;
myloop: LOOP
FETCH cursor1 INTO v_table, v_column, v_length;
IF v_done = 1 THEN
leave myloop;
END IF;
SET v_text = CONCAT( v_text, ‘ALTER TABLE ‘, v_table, ‘ MODIFY COLUMN ‘, v_column, ‘ ‘ ,v_newtype ,'(‘,v_length,’) UNSIGNED;’);
END LOOP;
SELECT v_text;
END