0

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

谢谢!

4

4 回答 4

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演示

于 2013-08-26T15:37:19.230 回答
2

您需要通过从数据库中提取数据来生成 alter table 语句。

select 'alter table MyTableName modify column ' + column_name + ' varchar(255);'
from information_schema where table_name = 'MyTableName'

然后将该命令的结果粘贴到查询窗口中并运行它——确保它执行您希望它执行的操作。先做个备份。

或者你可以通过用逗号替换分号来做出一个大的改变语句(如果 MySql 不会阻塞它)。

于 2013-08-26T15:27:22.433 回答
2

这不是你真正需要做的。你有更重要的事情要做:标准化你的数据库

现在,您不可能有一个包含 600 列的规范化表。至少遵循第三范式规则,正确拆分该表中的实体。之后,您将拥有一个更易于维护的更好的数据库。

为此,您需要删除当前表,因此,您无需将所有类型更改为 varchar(255),因为您将在创建其他表期间修复它们。

这将是一个好的开始阅读:http ://en.wikipedia.org/wiki/Database_normalization (感谢@Tim Schmelter 来自问题的评论)

于 2013-08-26T15:20:49.567 回答
0

如果您使用的是 PhpMyAdmin 或其他,您也可以点击按钮来修改表格。

当您在网页上时,Ctrl+Shift+J在 WindowsCmd+Opt+J下或 Mac 下按以打开 Chrome 开发人员工具中的控制台窗口。现在输入以下命令,将所有出现的数字 255 替换为 100 :

document.body.innerHTML = document.body.innerHTML.replace(/255/g, "100").

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

于 2021-01-26T13:24:18.980 回答