为什么主键不能包含空值?

时间:2014-09-06 14:30:24

标签: mysql

我已经读过mysql在主键上放置了一个非null的约束,但是唯一键允许列的一个空值。那么为什么主键也不允许空值?

7 个答案:

答案 0 :(得分:7)

PRIMARY KEY列相当于UNIQUE和NOT NULL,默认为索引列 它应该是UNIQUE,因为主键标识表中的行,因此2个不同的行不应该具有相同的键 另外,主键可以在其他表中使用FOREIGN KEY,这就是为什么它不能为NULL,以便另一个表可以在引用的表中查找行。

例如:

CREATE person{   
   id INT PRIMARY KEY,  -- equals UNIQUE NOT NULL   
   name VARCHAR(20)   
};   

CREATE family{   
   id INT PRIMARY KEY,  -- equals UNIQUE NOT NULL   
   menber_id INT FOREIGN KEY REFERENCE person(id)   
};   

答案 1 :(得分:2)

主键必须唯一地标识记录 - 即,每个记录可以用"具有等于X"的键的记录表示。由于null不等于任何值,因此不能将其用作主键。

答案 2 :(得分:1)

主键用于标识表中唯一的行,该行不能为空,而唯一键可根据SQL规则包含空值。

例如,

表格包含以下学童数据记录:

Roll_NO | Name | Class | Address | School_Bus_ID

此处, Roll_NO 不应包含任何空值,因为它将用于识别学校中的学生。并且 School_Bus_ID 可能包含一些空值,因为有些孩子可能选择自己的交通而不是校车。

答案 3 :(得分:0)

因为未知的空值可能与另一个元组的主键中的值相同

答案 4 :(得分:0)

假设进行了一些实验之后,您将了解未知的空值。

如果该值等于某个其他主键的值,那么它不能在 避免将此主键值分配给空的关系。

此外,任何与null的比较大多是假的。

答案 5 :(得分:0)

说,您有一个表Employee(EID,isHeadFor),其表头“ EID”为主键,“ isHeadFor”为外键,引用了表Department(DeptID)的主键“ DeptID”。如果DeptID取“ NULL”值,那么,如果说EID-123的Employee不是任何部门的负责人,那么,我们给与EID-123对应的field-isHeadFor赋予“ NULL”值。但是,问题是,仅查看表,我们就不能说EID-123的雇员是没有部门的负责人还是部门“ NULL”的负责人。

答案 6 :(得分:-1)

这是主键和唯一键之间的主要区别。