MySQL ALTER列到表中的最后位置
作者:互联网
我正在与一个客户合作,该客户希望大型数据库中的每个表都具有每个记录的历史记录数据,并且为了美观起见,希望这些列位于每个表的末尾.例如:
表名
>主键
>数据列
>历史列
所以我的问题是,是否有一条SQL命令将列移动到表的末尾?我更喜欢编写一个存储过程,以预定顺序将每个历史列移动到最后一个位置,但是MySQL似乎唯一的命令是FIRST和AFTER,没有LAST选项.
除了查询information_schema表中具有最高序数位置的列并在之后将其移动之外,是否有一种简单的解决方案?
编辑
我当前的解决方案是找到具有以下内容的最底行:
SELECT column_name FROM information_schema.columns
WHERE table_name = tableName AND table_schema = currentSchema
AND ordinal_position IN
(SELECT max(ordinal_position) FROM information_schema.columns
WHERE table_name = tableName AND table_schema = currentSchema
AND column_name <> 'first_history_column'
GROUP BY table_name);
然后相应地订购它们,如下所示:
ALTER TABLE tableName MODIFY 'first_history_column' AFTER column_name;
ALTER TABLE tableName MODIFY 'second_history_column' AFTER 'first_history_column';
etc...
有没有比当前解决方案更快的方法?
解决方法:
要移动列,您必须复制它.
ALTER TABLE test ADD history_new VARCHAR(60)
将在表格末尾插入一个新列.
UPDATE test SET history_new=history_old
将值从旧列复制到新列.和
ALTER TABLE test DROP history_old
将删除旧列.
编辑
只是给我以前没有想到的一种选择:
ALTER TABLE test ADD dummy TINYINT(1)
在表末尾插入一个虚拟列,只是因为您知道名称.
ALTER TABLE test MODIFY first_history_column AFTER dummy
ALTER TABLE test DROP dummy
然后,将您的历史记录列移动到虚拟对象之后并将其删除.因此,它只有3个ALTER TABLES,而没有UPDATE.
标签:database-schema,alter-table,sql,mysql,database 来源: https://codeday.me/bug/20191119/2037021.html