所以我已经有了一个表,但是它没有主键ID列。我想用散列来创建列。因此,现在我所做的是将列(id)创建为一个自递增的主键列,并尝试使用此查询对其进行散列:
CREATE index ON table USING hash (id)但是,在我运行查询后,对于该列,似乎没有任何变化--它仍然显示1、2、3.
发布于 2018-10-18 17:16:45
请考虑驱动程序给出的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,您还可以使用pgcrypto模块的digest函数来处理其他散列方法。
但是,一个缺点是磁盘空间的使用增加了。
我不确定是否有什么表现上的好处。
发布于 2018-10-18 18:01:27
不是的。
我认为你所做的不是一个好的练习。主键不表示为可见。这是一个内部行标识符。谁在乎它有什么价值?只要它是独一无二的,就足够了。
好吧..。除非你想用“自然键”但我有强烈的反对意见。很好,他们是在学校教的,所以你知道什么是你不应该使用的。
现在,如果您希望PK有一些特定的格式,那么这是因为您希望它对其他进程甚至人都是可见的。然后,它将受到需求变化的影响(“我希望PK只在大写!”或“请用州代码预置!”)。如果你沿着这条路走,那就是自找麻烦。
解决办法?创建一个辅助列,该列也是唯一的。它不是PK,您甚至可以根据其他参数生成它。随着时间的推移,你甚至可以改变它,没有所有的副作用,一个PK有,如外键引用,锁定等。
见鬼,你可以有二十个次要的唯一标识符,用于任何你可能想到的深奥用途。别把主钥匙弄乱了。保持简单。
https://stackoverflow.com/questions/52878961
复制相似问题