【问题标题】:id auto_inc column, but no primary key?id auto_inc 列,但没有主键?
【发布时间】:2021-09-20 01:21:02
【问题描述】:

我为这个糟糕的标题道歉,但我不知道该如何表达它。

假设我想创建一个us_states 表,如下所示:

create table us_states
(
    id   serial,
    name varchar(256) not null constraint us_states_pk primary key,
    code varchar(256) not null
);

如果我不打算将 db_table 中的自动增量 id 列用作所述 db_table 的主键,那么它有什么实际好处(如果有的话)?

【问题讨论】:

  • 每个条目都将获得它自己的轻量级 Id 值,而没有主键会带来的“复杂性”,例如唯一常量、索引、外键机制等。您还可以查看自创建表以来该表中有多少条目。
  • 其实,没关系。我现在完全理解你的说法了。非常感谢您的精彩回答。
  • 自动增量只会确保您不必在每次插入时手动插入 ID 值。主键仍然可以是自动增量的,但是您必须建立一种机制来确保新插入的行具有唯一值。您只需确保新行获得“可能的最大值+1”,因为它是主键/id,就复杂性而言,您可以节省一些计算时间......我建议你阅读手册......或者关于主键的讲座和它的功能
  • 会的。非常感谢!
  • 不相关,但是:varchar 最大长度的所谓“神奇”值 256 并不意味着任何性能或存储优化,例如如果您假设 260 或 275,那么 256 在某种程度上比更高的值“更好”。

标签: database postgresql


【解决方案1】:

如果添加自动递增的数字列不是主键或唯一约束,则它的值为零。

如果您有一个像 name 这样的唯一列,则只有两个注意事项不将其用作主键:

  • 在引用这个数字的表中存储一个数字而不是名称将节省空间

  • 修改主键列很痛苦,应该避免修改,所以如果名称在正常操作中发生变化,使用不同的列作为主键是有意义的

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多