在可空字段上定义的MySql唯一约束究竟如何工作?
问题描述:
我不是那么到数据库(我使用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字段设置为空?
答
答案为create index
埋在documentation深:
一个
UNIQUE
指数产生使得指数 所有的值必须是不同的约束。如果尝试使用与现有行匹配的键值 添加新行,则会发生错误。 对于所有引擎,UNIQUE
索引允许包含NULL
的列的多个NULL
值。
请注意,此行为因数据库而异。有些只允许一个NULL
值。
为了您的目的,unique
索引/约束正好满足您的需求。
想想这样:'NULL'不等于_anything_,包括另一个'NULL'。因此,“唯一”索引中可能有大量“NULL”值是合乎逻辑的。 –
@RickJames。 。 。这不是一个很好的推理。一些数据库允许多个“NULL”值;有些不。这只是你必须记住的事情(或记住要查找),比如数据库是否进行整数除法。 –