gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:13:18 24 4
gpt4 key购买 nike

我在这里处理的是一个 MySQL 表,它以一种有点不幸的方式键入。它没有使用自动增量表作为键,而是使用一列小数来保留顺序(大概是这样在保留主键和顺序的同时插入新行并不太困难)。

在我检查并重做此表以使其更合理之前,我需要弄清楚如何在不破坏所有内容的情况下重新输入它。

我想做的是获取一个 double 列表(当前键)并输出一个整数列表(可以转换为 double 以进行重新键控)。

例如,输入 {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

现在,在需要它的表中添加一个新键列

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com