gpt4 book ai didi

mysql - 基于现有值随机化主键

转载 作者:行者123 更新时间:2023-11-29 01:11:38 24 4
gpt4 key购买 nike

我有一个较旧的数据库(出于一些非常可疑和晦涩的原因,我不想在这里过多讨论主题)我想随机化或随机排列主键。

我现在在 Mysql 数据库表中有自增字段。

我的关系不多,存在的不定义为外键。不需要保留关系。

我正在寻找的是获取主键的当前值并将其替换为随机值,例如:

ID := new(ID)

其中新函数从所有具有 1:1 匹配的旧 ID 集合中返回一个值。例如

2 := 3
3 := 2

但不是

2 := 3
3 := 3

有没有办法通过(理想情况下)每个表的单个 SQL 查询来更改数据库中的数据?

编辑:我没有非常严格的要求。如果有帮助,考虑对数据库进行独占访问,包括来回更改主键的约束,例如更改表,执行操作,将表更改为以前的模式。也可以为新(或旧)PK 值添加另一列。

最佳答案

只是程序的一部分。创建两个临时表

CREATE TABLE temp_old
( ai INT NOT NULL AUTO_INCREMENT
, id INT NOT NULL
, PRIMARY KEY (ai)
, INDEX old_idx (id, ai)
) ENGINE = InnoDB ;

CREATE TABLE temp_new
( ai INT NOT NULL AUTO_INCREMENT
, id INT NOT NULL
, PRIMARY KEY (ai)
, INDEX new_idx (id, ai)
) ENGINE = InnoDB ;

将不同顺序的id值复制到两个表中(在第二个表中随机):

INSERT INTO temp_old
(id)
SELECT id
FROM tableX
ORDER BY id ;

INSERT INTO temp_new
(id)
SELECT id
FROM tableX
ORDER BY RAND() ;

然后我们删除主键:

ALTER TABLE tableX
DROP PRIMARY KEY ;

运行实际的 UPDATE 语句:

UPDATE tableX AS t
JOIN temp_old AS o
ON o.id = t.id
JOIN temp_new AS n
ON n.ai = o.ai
SET t.id = n.id ;

然后重新创建主键并删除临时表:

ALTER TABLE tableX
ADD PRIMARY KEY (id) ;

DROP TABLE temp_old ;
DROP TABLE temp_new ;

SQL-Fiddle 中测试

关于mysql - 基于现有值随机化主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063293/

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