postgresql:更改主键

时间:2015-06-13 08:04:56

标签: database postgresql

到目前为止,我有一个列account_name作为我的数据库的主键。我现在想要使用account_name的哈希作为主键。

因此,作为一项临时措施,我添加了一个account_hash列,并为其指定了UNIQUE约束,以便account_nameaccount_hash一起存在。

我为所有数据库条目填充了account_hash,现在实际上使用account_hash作为数据库的密钥,并且不再使用account_name进行任何操作。

但当然因为account_name是"官员"主键,并且必须为NOT NULL,对于我使用相同散列填充account_nameaccount_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

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用

删除当前主键
ALTER TABLE tablename DROP CONSTRAINT users_pkey;

使用

创建account_hash
ALTER 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,如果需要一个非常大的键空间)更糟糕,所以如果没有使用哈希的具体原因,我就不会这样做。