数据库
首页 > 数据库> > MySQL ALTER列到表中的最后位置

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