基于现有值随机化主键

hak*_*kre 2 mysql sql shuffle

我有一个较旧的数据库(在某些非常可疑和模糊的原因,我不喜欢在这里放太多主题)我想随机化或随机播放主键.

我现在在Mysql数据库表中有自动增量字段.

我没有太多关系,那些存在的关系没有被定义为外键.不需要保留关系.

我正在寻找的是获取主键的当前值并将其替换为以下值中的随机值:

ID := new(ID)
Run Code Online (Sandbox Code Playgroud)

新函数从具有1:1匹配的所有OLD ID的集合返回值.例如

2 := 3
3 := 2
Run Code Online (Sandbox Code Playgroud)

但不是

2 := 3
3 := 3
Run Code Online (Sandbox Code Playgroud)

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

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

ype*_*eᵀᴹ 5

只是程序的一个方面.创建两个临时表

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 ;
Run Code Online (Sandbox Code Playgroud)

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() ;
Run Code Online (Sandbox Code Playgroud)

然后我们删除主键:

ALTER TABLE tableX
  DROP PRIMARY KEY ; 
Run Code Online (Sandbox Code Playgroud)

运行实际的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 ;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE tableX
  ADD PRIMARY KEY (id) ; 

DROP TABLE temp_old ;
DROP TABLE temp_new ;
Run Code Online (Sandbox Code Playgroud)

SQL-Fiddle中测试过