我读过,mysql在主键上放置了一个不为空的约束,但是唯一键允许一列有一个空值。那么为什么不是主键也允许一个空值?为什么主键不能包含空值?
回答
PRIMARY KEY列相当于UNIQUE和NOT NULL,默认情况下索引列。
它应该是唯一的,因为主键标识表中的行,所以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外键 – 2014-09-06 14:52:00
主键必须唯一地标识一个记录 - 即每个记录可以用“具有等于X的键的记录”的术语表示。由于null
不等于任何值,因此不能用作主键。
或放换句话说,'NULL'实际上表示__不存在value_,它本身并不是一个值。 – Alnitak 2014-09-06 14:36:28
主键用于在不能为空,而唯一键可能包含空值按SQL规则的表中唯一标识行。
例如,
一个表包含学童数据的记录像下面:
Roll_NO | Name | Class | Address | School_Bus_ID
这里,Roll_NO不应包含任何空值,因为它会被用来识别一个学生学校 。而School_Bus_ID可能包含一些空值,因为有些孩子可能会选择自己的交通工具,而不是校车。
这是主键和唯一密钥之间的主要区别。
OP已经知道有区别。他们在问为什么。 – 2014-09-06 14:53:04
由于空值,是未知的,可能是相同的。在另一元组的主关键字的值
- 1. 为什么我不能包含博客?
- 2. 主键列1行可以包含空值?
- 3. 包含空值
- 4. 包含空值
- 5. 为什么你不能使用SQLite ROWID作为主键?
- 6. “默认值”包含什么?
- 7. “键不能为空”
- 8. 为什么HttpContext不包含“主机”标题?
- 9. 为什么LINQ不包含“distinct”关键字?
- 10. 为什么在包含另一个URLconf时不能传递`app_name`关键字arg?
- 11. 为什么使用主键?
- 12. PHP/MySQL的:不确定为什么变量不包含值
- 13. 参数'名称'不能为空,空或只包含空格
- 14. 什么是使主键可为空号与非空的
- 15. Cookies:为什么他们不够大?有什么存储的cookie不能包含?
- 16. json能否包含相同的键值?
- 17. 为什么[import java.awt。*]不包含[import java.awt.event.ActionEvent]?
- 18. 为什么ICollection不包含Add方法?
- 19. 为什么Silverlight不包含Messenger组件?
- 20. 为什么角度不包含加载?
- 21. EclEmma为什么不包含syncronized(MyClass.class)?
- 22. 为什么BEGIN_COM_MAP包含DEBUG_QI_ENTRY?
- 23. 为什么iostream包含time.h?
- 24. 为什么我不能基于主键调用SQL选择?
- 25. 为什么此化合物主键不能按预期工作?
- 26. 为什么__setattr__的“name”参数包含类,但__getattr__不包含?
- 27. 休眠 - 复合主键包含外键
- 28. 为什么结构不能包含它自己的实例?
- 29. 为什么编译器不能找到mysql包含?
- 30. 为什么web.xml'context-param'不能包含character [children]?
当插入0,缺省值,NULL值转换成与主键列然后推新自动增量值 – zloctb 2014-11-05 15:26:08