我有一张桌子Users
。
我有一个自动增加的长 id 作为主要。现在我需要用户名也是唯一的。最佳做法是什么?
我应该只保留用户名并删除数字ID吗?我应该以某种方式使它们都独一无二吗?你有什么建议吗?
也许还应该提到使用休眠。
我有一张桌子Users
。
我有一个自动增加的长 id 作为主要。现在我需要用户名也是唯一的。最佳做法是什么?
我应该只保留用户名并删除数字ID吗?我应该以某种方式使它们都独一无二吗?你有什么建议吗?
也许还应该提到使用休眠。
通常,您会在用户名上添加“唯一约束”。拥有自动增量 id 并不是严格需要的,但不使用“自然键”是一种常见的做法。请参阅此相关问题:本 机主键还是自动生成的主键?.
要保持用户名的唯一性,您只需要:
ALTER TABLE Users
ADD CONSTRAINT constraint_name UNIQUE (username);
无需更改主键。id
有一个主键很有用。它允许您更改用户名,而无需UPDATE
链接表。
UPD:唯一的情况是,当您不想保持两个 PK(一个真正的,另一个“半”PK)时,就是桌子UPDATE/INSERT/DELETE
每秒有很多。在这种情况下,2 个索引与 1 个索引的开销可能会很明显。
用户名可以更改吗?如果没有,您可以将其用作主键。这将是一个自然键,因此,在我看来,它比代理键更好,例如您当前使用的。
如果用户名可以更改,那么它不适合用作主键。
由于您无法知道将来可能出现的所有情况,我怀疑您不能排除用户名可能需要更改的可能性。因此,代理键是面向未来的选择。
即使用户名不是主键,也可以对用户名进行唯一约束。您很可能还需要一个非空约束。
这取决于您的应用程序是如何使用的。如果用户名可以更改,我建议使用 ID 作为主键 - 您可以随时在代码中进行一些检查,以确保用户名在创建时是唯一的。
在从数据库访问数据时使用 ID(主键)是一种常见的做法,因为如果您要使用其他任何东西,可能会引入难以调试的意外行为。