【问题标题】:MySQL PRIMARY KEY vs UNIQUE constraintsMySQL PRIMARY KEY vs UNIQUE 约束
【发布时间】:2017-11-26 05:56:09
【问题描述】:

根据 MySQL 文档,PRIMARY KEY 约束和 UNIQUE 约束之间的区别在于 PK 约束不允许 NULL 值,而 UQ 约束允许 NULL 值。在 MySQL 表中,可以为同一列创建 PK 和 UQ!

  • 为已经有 PK 约束的列创建 UNIQUE 约束有什么意义或理由!?
  • 为什么 MySQL 允许为已有 PK 约束的列创建唯一约束?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    作为前言,请注意主键不必是单个列:它可以由多个列组成:这称为复合键。另请注意,并非每个表都具有 AUTO_INCREMENT/IDENTITY 列,无论如何您都可以在复合键内的单个列上具有 UNIQUE 约束。

    1. 没有 - 但 DBMS 禁止 这种冗余是没有意义的,因为您需要增加逻辑和复杂性来处理这种情况,而没有真正的两者兼而有之会造成损害(除了必须维护两个索引对性能的影响之外)。

    2. 如上所述:因为检测和防止冗余的机会成本是不值得的。

    要考虑的另一件事是,表的主键定义不是不可变的,因此可能会发生变化。一个表可能已经有带有UNIQUE 约束设置的列,然后数据库设计者决定将其包含在主键的新定义中 - 要求首先删除旧约束对用户不友好,特别是如果他们的应用程序系统的其他部分依赖于存在的唯一约束(例如1:0..1 关系定义)。

    (另外,AUTO_INCREMENTUNIQUEPRIMARY KEY 不相互包含:您可以将AUTO_INCREMENT 与非唯一列一起使用(例如,如果在表已经包含数据之后添加AUTO_INCREMENT),相反,PRIMARY KEY 可以使用来自其他地方的唯一值,例如另一个身份列作为外键(复合主键可以包含外键!)或“自然”数据源,例如使用美国社会安全号码作为一个主键(当然你应该从不在现实中这样做)。

    【讨论】:

    • 这种对一列或多列复合主键的 UNIQUE 约束的解释确实有一定的意义,但从您的回答中,我得出结论,通常对于只有一列主键的最简单情况 - 没有对同一列有额外的 UNIQUE 约束的感觉——这只是一种冗余。
    • @sbrbot 正确。对于这种特定情况,它是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多