mysql - 在 MySQL 中修改十进制键表的最快方法?

标签 mysql database algorithm primary-key

我正在处理一个 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/

相关文章:

php - Codeigniter:一张表中的多个 COUNT 和 SUM

mysql - 嵌套集层次结构中的多个表

algorithm - 带有for循环的伪代码

java - Karatsuba 乘法 java 递归代码不起作用?

用于自动完成的 Python 类型推断

mysql - 一个脚本(每周)清空我数据库中的一个表

Java + Mysql 从 ISO-8859-1 到 UTF-8

database - 从一个字段可能有多个值的数据库中查询

php - 有没有办法将 "obfuscatd"文本插入 MySql,这样我就无法读取我的用户存储在其中的内容?

database - DynamoDB 查找最近的整数键