所以我已经有一个表,但是它没有主键ID列。我想用哈希创建列。因此,现在我要做的是将列(id)创建为自增量主键列,并尝试使用此查询对其进行散列:
CREATE index ON table USING hash (id)
但是,在我运行查询后,该列似乎没有任何变化,它仍然显示1、2、3 ...
答案 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的所有副作用,例如外键引用,锁定等。
哎呀,对于您可能想到的任何深奥的用途,您可以有二十个二级唯一标识符。只是不要弄乱主键。保持简单。