在可空字段上定义的MySql唯一约束的工作原理是什么?

时间:2017-03-17 11:03:47

标签: mysql sql database mariadb rdbms

我不是很喜欢数据库(我正在使用 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的行吗?

1 个答案:

答案 0 :(得分:2)

答案深埋在create index的{​​{3}}中:

  

UNIQUE索引创建一个约束,以便索引中的所有值   必须是截然不同的如果您尝试使用a添加新行,则会发生错误   与现有行匹配的键值。 对于所有引擎,UNIQUE   index允许包含NULL的列的多个NULL值。

请注意,此行为因数据库而异。有些只允许一个NULL值。

为了您的目的,unique索引/约束可以满足您的需求。