到目前为止,我有一个列account_name
作为我的数据库的主键。我现在想要使用account_name
的哈希作为主键。
因此,作为一项临时措施,我添加了一个account_hash
列,并为其指定了UNIQUE约束,以便account_name
和account_hash
一起存在。
我为所有数据库条目填充了account_hash
,现在实际上使用account_hash
作为数据库的密钥,并且不再使用account_name
进行任何操作。
但当然因为account_name
是"官员"主键,并且必须为NOT NULL,对于我使用相同散列填充account_name
和account_hash
的任何新条目。
这样的工作正常,但现在我想要清理数据库,完全摆脱account_name
,并使account_hash
成为主键代替。
这样做的最佳方式是什么?它是一个不断使用的工作数据库,因此任何更改都必须至少对用户造成干扰。
以下是与相关列相关的\d+
信息:
Column | Type | Modifiers | Storage | Stats target | Description
-------------------------------+------------------------+-----------------------------+----------+--------------+-------------
account_name | character varying(255) | not null | extended | |
account_hash | character varying(256) | | extended | |
Indexes:
"users_pkey" PRIMARY KEY, btree (account_name)
"users_account_hash_256_key" UNIQUE CONSTRAINT, btree (account_hash)
Has OIDs: no
感谢您的帮助!
答案 0 :(得分:2)
您可以使用
删除当前主键ALTER TABLE tablename DROP CONSTRAINT users_pkey;
使用
创建account_hashALTER TABLE tablename ALTER account_hash SET NOT NULL;
之后,您可以使用
添加新的主键ALTER TABLE tablename ADD PRIMARY KEY USING INDEX indexname;
您可能必须首先删除users_account_hash_256_key
约束以避免重复,并且根据创建唯一索引的方式,您可能必须再次为此创建索引。
如果未在任何地方使用account_name列,则可以使用
删除它ALTER TABLE tablename DROP COLUMN account_name;
注意我会建议不要采取此行动。哈希有冲突,因此如果您将它们用作主键,可能有一段时间您无法将值插入数据库中。 varchar索引的性能也比使用整数(或UUID,如果需要一个非常大的键空间)更糟糕,所以如果没有使用哈希的具体原因,我就不会这样做。