我有一个较旧的数据库(在某些非常可疑和模糊的原因,我不喜欢在这里放太多主题)我想随机化或随机播放主键.
我现在在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值添加另一列.
只是程序的一个方面.创建两个临时表
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中测试过
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |