Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:将所有列转换为VarChar(255)_Mysql_Sql_Normalization - Fatal编程技术网

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

Mysql SQL:将所有列转换为VarChar(255),mysql,sql,normalization,Mysql,Sql,Normalization,在stackoverflow和web上进行了一些搜索之后,我找不到我问题的答案。我不是一个真正的SQL天才,但我正在尝试将表中的所有列转换为varchar(255)。它大约有600列,都是varchar,但大小限制不同。我希望它们都是255。有没有办法不必手动执行此操作?我使用MySQL 谢谢 这不是你真正需要做的。您有更重要的事情要做:规范化您的数据库 现在,不可能有一个包含600列的规范化表。至少遵循第三个标准格式规则,正确拆分该表中的实体。之后,您将拥有一个更易于维护的更好的数据库 为此,

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


谢谢

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

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

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


这将是一个很好的开始:(感谢问题评论中的@Tim Schmelter)

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

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

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


这将是一个很好的开始:(感谢提问者的评论中的@Tim Schmelter)

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

select 'alter table MyTableName modify column ' + column_name + ' varchar(255);'
from information_schema where table_name = 'MyTableName'
然后将该命令的结果粘贴到查询窗口并运行它--确保它执行您希望它执行的操作。先做备份


或者,您可以通过将分号替换为逗号来生成一个大的alter语句(如果MySql不会阻塞的话)。

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

select 'alter table MyTableName modify column ' + column_name + ' varchar(255);'
from information_schema where table_name = 'MyTableName'
然后将该命令的结果粘贴到查询窗口并运行它--确保它执行您希望它执行的操作。先做备份


或者你可以通过用逗号替换分号来做一个大的alter语句(如果MySql不会被它卡住的话)。

首先,正如其他人提到的那样,你最好对数据进行规范化

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

这里是演示

首先,正如其他人提到的那样,您最好将数据正常化

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

这里是演示

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

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

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


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

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

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

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


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

在这个MySQL、Sql Server中,什么版本的数据库?为什么有一个600列的表?我在MySQL工作,很抱歉没有提到。“它大约有600列”怎么会发生这种情况?你听说过吗?在这个MySQL,Sql Server,什么版本的数据库中可能会出现重复?你他妈的为什么有一个600列的表?我在MySQL工作,很抱歉没有提到这一点。“它大约有600列”怎么会发生?你听说过吗?可能重复你让我好奇:我有一个表,第一列有一个类别,该类别有多达599个匹配关键字。因此,在分类之后,其余的列每个都包含1个关键字。您想如何规范化它?@user2704687包含三个表:一个包含类别列表,一个包含关键字列表,第三个包含类别id和关键字id(您现在有600行,这是规范化数据库的预期行为)。因此,如果可能的话,您可以拥有600多个类别。这是一个简单的N:M关系。另外,您正在将数据库可视化为excel表:不要这样做,数据库表不仅仅是二维表。@user2704687规范化解决方案的主要优点是更易于维护(您不需要更新或插入600个字段,您只需定义一次字段长度,您的查询肯定会更短),您不局限于确定的条目数,您可以向关键字添加元数据(例如缩写、拼音书写…以增强查找)你让我好奇:我有一个表,在第一列中有一个类别,该类别最多有599个匹配关键字。因此,在分类之后,其余的列中每个都有一个关键字。你想如何将其规范化?@user2704687有三个表:一个有类别列表,一个有关键字列表,第三个有类别id和关键字_id(您现在有600行,这是规范化数据库的预期行为)。因此,如果发生这种情况,您可以有600多个类别