哈希主键postgresql

时间:2018-10-18 16:53:46

标签: sql postgresql

所以我已经有一个表,但是它没有主键ID列。我想用哈希创建列。因此,现在我要做的是将列(id)创建为自增量主键列,并尝试使用此查询对其进行散列:

CREATE index ON table USING hash (id)

但是,在我运行查询后,该列似乎没有任何变化,它仍然显示1、2、3 ...

2 个答案:

答案 0 :(得分:2)

请考虑使用answer 穿刺者

我相信您要实现的目标是更改已经存在的id列的类型。另外,您必须更改id的默认值才能为每个新行获取散列的id。

CREATE TABLE test (
  id SERIAL NOT NULL PRIMARY KEY,
  label TEXT
);

INSERT INTO test (label) VALUES ('v1'), ('v2'), ('v3'), ('v4');

ALTER TABLE test ALTER COLUMN id TYPE text USING md5(id::TEXT);
ALTER TABLE test ALTER COLUMN id SET DEFAULT md5(nextval(pg_get_serial_sequence('test', 'id'))::TEXT);

INSERT INTO test (label) VALUES ('v5');

在这种情况下,使用md5,还可以将digest模块的pgcrypto函数用于其他哈希方法。

但是,一个缺点是磁盘空间使用量增加。

我不确定是否会有任何性能上的好处。

答案 1 :(得分:1)

否。

我认为您在做什么不是一个好习惯。主键并不意味着可见。这是一个内部行标识符。谁在乎它具有什么价值?只要它是唯一的,就足够了。

好吧……除非您想使用“自然键”,但我对此有强烈的反对意见。他们在学校教的很好,所以您知道您不应使用的东西。

现在,如果您希望PK具有某些特定格式,那是因为您希望它对其他进程甚至其他人可见。然后,它会随需求的变化而变化(“我只希望PK使用大写字母!”或“请在状态码前加上它!”)。如果您走这条路,那就是自找麻烦。

解决方案?创建也是唯一的辅助列。那不是PK,您甚至可以根据其他参数生成它。您甚至可以及时更改它,而没有PK的所有副作用,例如外键引用,锁定等。

哎呀,对于您可能想到的任何深奥的用途,您可以有二十个二级唯一标识符。只是不要弄乱主键。保持简单。