在stackoverflow和网上搜索了一些内容之后,我找不到问题的答案。我不是一个真正的SQL人才,但我试图将我表中的所有列转换为varchar(255)。它有大约600列,都是varchar,但大小限制各不相同。我希望它们都是255.有没有办法不必手动执行此操作?我使用MySQL。
谢谢!
答案 0 :(得分:2)
这不是你真正需要做的。您有更重要的事情要做:正常化您的数据库
现在,您不可能拥有600列的规范化表格。按照至少第3个普通表单规则正确拆分该表中的实体。在那之后,你将拥有一个更容易维护的更好的数据库。
为此,您需要删除当前表,因此,您不需要将所有类型更改为varchar(255),因为您将在创建其他表期间修复它们。
这将是一个良好的开端:http://en.wikipedia.org/wiki/Database_normalization(感谢来自问题评论的@Tim Schmelter)
答案 1 :(得分:2)
您需要通过从数据库中提取数据来生成alter table语句。
select 'alter table MyTableName modify column ' + column_name + ' varchar(255);'
from information_schema where table_name = 'MyTableName'
然后将此命令的结果粘贴到查询窗口并运行它 - 确保它执行您希望它执行的操作。先做备份。
或者你可以通过用逗号替换分号来制作一个大的修改语句(如果MySql不会阻塞它)。
答案 2 :(得分:2)
首先,如其他人所说,您最好规范化数据。
与此同时,您可以使用动态SQL实现目标
DELIMITER $$
CREATE PROCEDURE change_to_varchar255(IN _tname VARCHAR(64))
BEGIN
SET @sql = NULL;
SELECT GROUP_CONCAT(
CONCAT_WS(' ', 'CHANGE', COLUMN_NAME, COLUMN_NAME, 'VARCHAR(255)'))
INTO @sql
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = _tname
AND DATA_TYPE = 'varchar'
AND CHARACTER_MAXIMUM_LENGTH < 255
AND TABLE_SCHEMA = SCHEMA();
SET @sql = CONCAT_WS(' ', 'ALTER TABLE', _tname, @sql);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
样本用法:
CALL change_to_varchar255('table1');
这是 SQLFiddle 演示
答案 3 :(得分:0)
如果您使用的是PhpMyAdmin或其他,也可以点击按钮修改表格。
当您在网页上时,在 Windows 下按 Ctrl+Shift+J
或在 Mac 下按 Cmd+Opt+J
打开 Chrome 开发者工具中的控制台窗口。现在输入以下命令将所有出现的数字 255 替换为 100 :
document.body.innerHTML = document.body.innerHTML.replace(/255/g, "100")
。
最后,点击按钮执行查询。