我有一个PHP脚本,用户在其中创建调查问卷,以及DB中用于存储传入数据的脚本表。该网站已经存在了一段时间,数据库中大约有100个表。
我的剧本非常有缺陷!它在我真正需要“文本”的地方要求“tinytext”字段。有没有办法批量更新所有tinytext列到文本?
谢谢!
答案 0 :(得分:1)
执行此操作的一种方法是查找给定数据库中的所有tinytext
列,然后为每列创建ALTER TABLE
语句。使用存储过程的工作解决方案:
DELIMITER $$
DROP PROCEDURE IF EXISTS `BULK_RETYPE` $$
CREATE PROCEDURE `BULK_RETYPE`(IN SCHEMA_NAME VARCHAR(255), IN FROM_TYPE VARCHAR(255), IN TO_TYPE VARCHAR(255))
BEGIN
DECLARE `done` INT DEFAULT FALSE;
DECLARE tn VARCHAR(255);
DECLARE fn VARCHAR(255);
DECLARE `cur1` CURSOR FOR
SELECT
`TABLE_NAME`,
`COLUMN_NAME`
FROM
`information_schema`.`COLUMNS`
WHERE
`DATA_TYPE` = FROM_TYPE AND `TABLE_SCHEMA` = SCHEMA_NAME;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO `tn`, `fn`;
IF done THEN
LEAVE read_loop;
END IF;
SET @ALTER_SQL = CONCAT('ALTER TABLE ', '`', tn,'`' , ' MODIFY ', '`', fn,'`' , ' ', TO_TYPE);
PREPARE stmt1 FROM @ALTER_SQL;
EXECUTE stmt1;
END LOOP;
CLOSE cur1;
END $$
DELIMITER ;
CALL BULK_RETYPE('test', 'tinytext', 'text');
答案 1 :(得分:1)
没有存储过程的解决方案(仅使用phpMyAdmin或任何其他DBA工具)。
运行以下查询
SELECT
CONCAT('ALTER TABLE ',
TABLE_NAME,
' CHANGE COLUMN ',
COLUMN_NAME,
' ',
column_name,
' TARGET_TYPE ',
CASE
WHEN IS_NULLABLE = 'NO' THEN ' NOT '
ELSE ''
END,
' NULL;') AS que
FROM
information_schema.columns
WHERE
table_schema = 'MY DB'
AND data_type = 'SOURCE_TYPE';
此查询将返回您要触发的所有语句。您可以运行它们或保存到SQL升级脚本
示例(从tinyint到bit):
ALTER TABLE mytable CHANGE COLUMN redacted redacted BIT NULL;
ALTER TABLE mytable CHANGE COLUMN redacted2 redacted2 BIT NOT NULL;
答案 2 :(得分:0)
不是真的,但如果你使用PHPMyAdmin,这是一个相当快速的任务......或者,你可以导出你需要更改的所有表和字段的列表,并将必要的ALTER TABLE语句放在一起,然后执行它们。
答案 3 :(得分:0)
您只需从架构中选择并准备SQL以进行批量更改
SELECT table_scheme, table_name, columun_name FROM information_schema.`COLUMNS`
WHERE DATA_TYPE='tinyint'