根据定义,MySQL表中的行没有可靠的“自然”顺序,除非我添加递增ID,时间戳等。但是,我经常可以重新构建在没有ORDER的情况下运行SELECT时添加行的顺序(INSERT)。
出于隐私原因,我试图摆脱这种“内部”秩序。如果我有Excel表格,我会在另一个随机选择的行之前插入新行。但是MySQL中没有INSERT AFTER
......
有什么想法吗?
背景
我需要隐瞒两行(同时插入同一个表中,即使在一个事务中)也属于一起。而一个(一个邪恶的员工,一个黑客入侵服务器)应该无法重建这两个条目的关系。
已考虑解决方案
INSERT SELECT
- >重新创建数据库的副本将无法正常工作,因为表格非常大,有很多插入,并且锁定表格进行重写会是一个问题。答案 0 :(得分:4)
默认存储引擎InnoDB始终按主键组织表。如果您在没有ORDER BY
的情况下进行查询,MySQL将以其用于访问表的索引顺序返回行(主键顺序或使用的任何二级索引的顺序)。
这可能是使用UUID作为主键的好机会。
UUID似乎是一个随机唯一编号,尽管它确实有一些结构。按时间顺序推断哪些行彼此靠近需要reading some documentation(这意味着几乎所有潜在的邪恶员工都不会对此有所了解)。
答案 1 :(得分:1)
正如Bill Karwin已经指出的那样(我在这里重复),InnoDB表总是由群集密钥“按顺序”组织。对于群集密钥,InnoDB使用PRIMARY KEY。如果没有PRIMARY KEY,则第一个非null UNIQUE KEY。否则,是合成密钥。
https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html
要以更“随机”的顺序插入行,我们需要一个不显示插入顺序的集群密钥。
但是更改群集密钥需要重建表重建,这似乎已被排除。
Bill Karwin建议使用UUID作为群集密钥。
另一种方法是将合成列添加为集群键中的前导列,合成列的值可以由BEFORE INSERT触发器填充。触发器可以使用算法生成伪随机值,使用从其他列值计算的哈希和/或从RAND()函数返回。
我们还需要确保没有任何其他索引可以确定插入顺序。
但是所有这些选项都需要重建表格。