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