我不是很喜欢数据库(我正在使用 MySql),我对在可空字段上设置的**唯一约束存在以下疑问
据我所知,UNIQUE约束确保列中的所有值都不同。
但是如果我在表的可空字段上设置唯一约束会发生什么。
例如,我有 DDL 表定义:
CREATE TABLE results (
id BigInt UNSIGNED NOT NULL AUTO_INCREMENT,
sample_id VarChar(128) NOT NULL,
doi VarChar(128),
result VarChar(2) NOT NULL,
error Text,
PRIMARY KEY (
id
)
) ;
ALTER TABLE results COMMENT = '';
ALTER TABLE results ADD CONSTRAINT fk_results_pgrfas FOREIGN KEY (sample_id)
REFERENCES pgrfas (sample_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE results ADD CONSTRAINT u_results UNIQUE
(doi);
doi 字段可以为空。在此字段上设置了唯一约束,因为我希望阻止此表的更多行具有 doi 字段的相同值。
每行需要具有不同的 doi 值,但此字段可以为null,因此我需要让多行将 doi 字段设置为null。
唯一约束仅适用于设置值,或者还可以防止此 doi 字段的不同行具有 null 值? (这对我来说是一个问题,因为我需要唯一约束仅适用于非空值)。
那么我可以插入多个 doi 字段设置为null的行吗?
答案 0 :(得分:2)
答案深埋在create index
的{{3}}中:
UNIQUE
索引创建一个约束,以便索引中的所有值 必须是截然不同的如果您尝试使用a添加新行,则会发生错误 与现有行匹配的键值。 对于所有引擎,UNIQUE
index允许包含NULL
的列的多个NULL
值。
请注意,此行为因数据库而异。有些只允许一个NULL
值。
为了您的目的,unique
索引/约束可以满足您的需求。