SQL:将所有列转换为VarChar(255)

时间:2013-08-26 15:14:39

标签: mysql sql normalization

在stackoverflow和网上搜索了一些内容之后,我找不到问题的答案。我不是一个真正的SQL人才,但我试图将我表中的所有列转换为varchar(255)。它有大约600列,都是varchar,但大小限制各不相同。我希望它们都是255.有没有办法不必手动执行此操作?我使用MySQL。

谢谢!

4 个答案:

答案 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")

最后,点击按钮执行查询。