标签:database-schema alter-table sql mysql database
我正在与一个客户合作,该客户希望大型数据库中的每个表都具有每个记录的历史记录数据,并且为了美观起见,希望这些列位于每个表的末尾.例如:
表名
>主键
>数据列
>历史列
所以我的问题是,是否有一条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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。