我的问题是是否有可能有由多列组成的唯一索引,其中一列可能包含NULL
.
例子:命名“regulated_person” A表的数,包括列LAST_NAME
,FIRST_NAME
,BIRTH_DATE
和ALIAS
。的数据类型BIRTH_DATE
是date
,其他的则是 String/ VARCHAR
。LAST_NAME
,FIRST_NAME
并且BIRTH_DATE
不可为空,即它们需要值。ALIAS
对于两个或更多人具有相同的名字/姓氏并且在同一天出生的情况,可作为决胜局。因为打破平局的情况并不常见,我想避免提供ALIAS
值的需要,除非有必要。
作为后台,表的主键由自动增量生成器处理。唯一索引的目的是提供一个“业务键”,无需求助于主键即可识别行。我正在使用 MySQL 5.1.35 和 Hibernate ORM 版本。4.3.10.
欢迎任何有关除 MySQL 之外的服务器/数据库提供商的建议。
提前感谢您的任何指导,并提前为任何无意违反“论坛协议”的行为道歉,因为这是我第一次在任何地方提交问题。
由于alias
列可以为空,如果添加了unique
对复合材料的限制(last_name, first_name, birth_date, alias)
,仍然会有重复允许的,拥有相同的值在第3列NULL
中alias
。当至少有一个值为空时,将跳过/接受该约束。关于 MySQL 的文档CREATE TABLE
不是很清楚,但您可以测试其行为:
- 一个
UNIQUE
索引创建的约束,使得该指数的所有值必须是不同的。如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误。对于所有的发动机,一个UNIQUE
索引,可以多NULL
为可以包含列的值NULL
。
你可以做的是定义alias
asnot null
并添加一个default
值,(比如'NONE'
or'DEFAULT'
或空字符串''
)。您(或用户)不必提供该值,它将自动保存在所有行中。一旦有人尝试添加与现有行具有相同姓氏、名字和出生日期的新行,unique
约束将禁止它。我想你可以在那时添加一些过程,它会为 要求不同的值alias
并添加新行。