隐藏MySQL数据库表中的INSERT命令

时间:2018-03-26 20:14:35

标签: mysql mariadb sql-insert

根据定义,MySQL表中的行没有可靠的“自然”顺序,除非我添加递增ID,时间戳等。但是,我经常可以重新构建在没有ORDER的情况下运行SELECT时添加行的顺序(INSERT)。

出于隐私原因,我试图摆脱这种“内部”秩序。如果我有Excel表格,我会在另一个随机选择的行之前插入新行。但是MySQL中没有INSERT AFTER ......

有什么想法吗?

背景

我需要隐瞒两行(同时插入同一个表中,即使在一个事务中)也属于一起。而一个(一个邪恶的员工,一个黑客入侵服务器)应该无法重建这两个条目的关系。

已考虑解决方案

  • 使用INSERT SELECT - >重新创建数据库的副本将无法正常工作,因为表格非常大,有很多插入,并且锁定表格进行重写会是一个问题。
  • 添加一对时删除并重新插入另一行 - >在一张大桌子里,很多行都会保留原来的顺序,很可能缺乏可靠性:(

2 个答案:

答案 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()函数返回。

我们还需要确保没有任何其他索引可以确定插入顺序。

但是所有这些选项都需要重建表格。