【问题标题】:SQL: convert all columns to VarChar(255)SQL:将所有列转换为 VarChar(255)
【发布时间】:2013-08-29 03:17:15
【问题描述】:

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

谢谢!

【问题讨论】:

  • 在这个MySQL,Sql Server,什么版本的什么数据库?
  • 为什么你有一个有 600 列的表?
  • 我在 MYSQL 工作,抱歉没有提及。
  • “它有大约 600 列” 怎么会这样?你听说过normalization吗?

标签: mysql sql normalization


【解决方案1】:

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

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

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

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

【讨论】:

  • 你让我很好奇:我有一个表格,第一列中有一个类别,该类别最多有 599 个匹配的关键字。因此,在任何类别之后,其余列各包含 1 个关键字。你想如何标准化它?
  • @user2704687 包含三个表:一个包含类别列表,一个包含关键字列表,第三个包含 category_id 和 keyword_id(您现在有 600 行,这是预期的行为标准化数据库)。因此,您可以拥有超过 600 个类别(如果有的话)。这是一个简单的 N:M 关系。
  • 另外,您正在将数据库可视化为 Excel 表:不要那样做,数据库表不仅仅是二维表。
  • @user2704687 规范化解决方案的主要优点是更易于维护(您不需要更新或插入600个字段,您定义一次字段长度,您的查询肯定会更短),您不限于确定数量的条目,您可以在关键字中添加元数据(例如缩写、拼音……以增强查找)
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢。固定的。我被 600 号码吸引住了。
  • 警告。如果一列以前不是 NULL,则此代码将使它可以为 NULL,这是一个意想不到的副作用。
【解决方案3】:

首先,正如其他人所说,您最好规范化您的数据

与此同时,您可以使用这样的动态 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演示

【讨论】:

  • 小心。如果一列以前不是 NULL,则此代码将使它可以为 NULL,这是一个意想不到的副作用。
【解决方案4】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2014-04-16
    • 1970-01-01
    • 2013-11-27
    • 2013-07-21
    相关资源
    最近更新 更多