2017-03-17 54 views
1

我不是那么到数据库(我使用MySQL的),我有以下疑问的**独特约束设置好的可为空场在可空字段上定义的MySql唯一约束究竟如何工作?

所以从我所知道的唯一约束确保所有列中的值不同。

但是,如果我设置一个表的可空字段的唯一约束会发生什么。

例如,我有此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场本场可以为空。

唯一性约束仅适用于设置好的值或也防止型动物行具有DOI场空价值? (这对我来说是一个问题,因为我需要唯一约束只对非空值起作用)。

那么我可以插入多行,其中doi字段设置为空?

回答

2

答案为create index埋在documentation深:

一个UNIQUE指数产生使得指数 所有的值必须是不同的约束。如果尝试使用与现有行匹配的键值 添加新行,则会发生错误。 对于所有引擎,UNIQUE 索引允许包含NULL的列的多个NULL值。

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

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

+0

想想这样:'NULL'不等于_anything_,包括另一个'NULL'。因此,“唯一”索引中可能有大量“NULL”值是合乎逻辑的。 –

+0

@RickJames。 。 。这不是一个很好的推理。一些数据库允许多个“NULL”值;有些不。这只是你必须记住的事情(或记住要查找),比如数据库是否进行整数除法。 –