【发布时间】:2017-11-26 05:56:09
【问题描述】:
根据 MySQL 文档,PRIMARY KEY 约束和 UNIQUE 约束之间的区别在于 PK 约束不允许 NULL 值,而 UQ 约束允许 NULL 值。在 MySQL 表中,可以为同一列创建 PK 和 UQ!
- 为已经有 PK 约束的列创建 UNIQUE 约束有什么意义或理由!?
- 为什么 MySQL 允许为已有 PK 约束的列创建唯一约束?
【问题讨论】:
标签: mysql
根据 MySQL 文档,PRIMARY KEY 约束和 UNIQUE 约束之间的区别在于 PK 约束不允许 NULL 值,而 UQ 约束允许 NULL 值。在 MySQL 表中,可以为同一列创建 PK 和 UQ!
【问题讨论】:
标签: mysql
作为前言,请注意主键不必是单个列:它可以由多个列组成:这称为复合键。另请注意,并非每个表都具有 AUTO_INCREMENT/IDENTITY 列,无论如何您都可以在复合键内的单个列上具有 UNIQUE 约束。
没有 - 但 DBMS 禁止 这种冗余是没有意义的,因为您需要增加逻辑和复杂性来处理这种情况,而没有真正的两者兼而有之会造成损害(除了必须维护两个索引对性能的影响之外)。
如上所述:因为检测和防止冗余的机会成本是不值得的。
要考虑的另一件事是,表的主键定义不是不可变的,因此可能会发生变化。一个表可能已经有带有UNIQUE 约束设置的列,然后数据库设计者决定将其包含在主键的新定义中 - 要求首先删除旧约束对用户不友好,特别是如果他们的应用程序系统的其他部分依赖于存在的唯一约束(例如1:0..1 关系定义)。
(另外,AUTO_INCREMENT 与UNIQUE 或PRIMARY KEY 不相互包含:您可以将AUTO_INCREMENT 与非唯一列一起使用(例如,如果在表已经包含数据之后添加AUTO_INCREMENT),相反,PRIMARY KEY 可以使用来自其他地方的唯一值,例如另一个身份列作为外键(复合主键可以包含外键!)或“自然”数据源,例如使用美国社会安全号码作为一个主键(当然你应该从不在现实中这样做)。
【讨论】: