我正在处理一个 MySQL 表,该表的键控方式有些不幸。它不使用自动增量表作为键,而是使用一列小数来保留顺序(大概这样在保留主键和顺序的同时插入新行并不太困难)。
在我仔细检查这张表并将其重做为更正常的东西之前,我需要弄清楚如何在不破坏所有内容的情况下重新设置它的 key 。
我想要做的是获取 double 列表(当前 key )并输出整数列表(可以将其向下转换为 double 以重新生成 key )。
例如,输入 {1.00, 2.00, 2.50, 2.60, 3.00} 将给出输出 {1, 2, 3, 4, 5)。
由于这是一个数据库,我还需要能够很好地更新行:
UPDATE table SET `key`='3.00' WHERE `key`='2.50';
有人能想出一种快速的算法来做到这一点吗?我当前的想法是将所有 double 读入向量,获取向量的大小,并输出一个具有 1 => doubleVector.size
值的新向量。这看起来相当慢,因为您不想将每个值读入向量,例如,如果只需要修改最后的 n/100 个元素。
我认为我可能可以做一些事情,因为只有第一个非整数 double 之后的值需要修改,但我一生都无法弄清楚任何可以让我就地更新的事情以及。例如,第一次在原始键列表中看到 2.50 时将 2.60 设置为 3.00 会导致错误,因为键值 3.00 已用于表。
编辑:我想这真正抽象的是:
我需要一种方法将用 double 键控的有序映射转换为用整数键控的有序映射,其中一个键永远不存在两个值(无论如何,这都是对映射的违反)。
最佳答案
我假设您能够在某个时候关闭数据库来进行此转换。
注意:我不是 MySQL 用户。我选择的数据库是 PostgreSQL,因此 MySQL 的做法和 Pg 的做法之间可能存在语法错误。但这应该会给你一个好主意。
首先,制作一个将旧键映射到新键的键映射表:
create table keymap (
oldkey decimal,
newkey integer autoincrement
)
确保您对键盘映射建立索引,因为我们将对其进行大量查找。
create unique index keymap_oldkey on keymap(oldkey);
然后用旧 key 填充它并让 MySQL 创建新 key :
insert into keymap
select distinct `key` from fribbles order by `key`
现在您将拥有包含所有旧键的键映射,并且由于您尚未指定新键,因此您将填充 newkey
列上的自动增量,并且您的表格将看起来像。
oldkey newkey
----------------
1.5 1
1.6 2
1.93 3
3.1 4
现在,将 newkey 列添加到需要它的表中
alter table fribbles add column newkey integer
不要使其自动增量,因为否则它将在alter
时间填充,而我们不需要它。
现在,最后更新 fribbles
表:
update fribbles f
set newkey = ( select newkey from keymap m where m.oldkey = f.`key` )
最后,现在您已经填充了新 key ,您可以删除旧 key 。
alter table fribbles drop column `key`;
alter table fribbles alter column newkey rename to `key`;
我希望这能为您提供一个不错的攻击计划。
关于mysql - 在 MySQL 中修改十进制键表的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792431/