我明白,除非指定,否则外键列可以是NULL并且是重复的(至少在Oracle SQL中)。将外键列声明为非空且唯一或保留原样是否更好?这是根据当时的情况作出的决定,还是应该遵循的一般规则?外键列应该是唯一的而不是空的?
0
A
回答
2
所有数据库都允许外键为NULLable和非UNIQUE。您如何选择声明特定的外键取决于业务案例。
请考虑以下供销售特勤人员的公司使用的表格。
CountryList (
CountryCode NOT NULL PRIMARY KEY,
CountryName NOT NULL
)
SecretAgents (
CodeName NOT NULL PRIMARY KEY,
HomeCountryCode FOREIGN KEY REFERENCES CountryList(CountryCode)
)
显然,HomeCountryCode不会是唯一的,因为您可能在每个国家销售多个间谍。它可以为空吗?这取决于您的商业模式是否需要每个客户申报其本国或不。如果该模型允许您与没有本国的人开展业务,或者不希望向您透露本国,那么该字段应该是无效的。但是,如果在您的业务模型中不考虑无州的演员,则应声明NOT NULL列,以便无法创建无效的客户记录。
现在,考虑附加表
SpyMasters (
CountryCode NOT NULL PRIMARY KEY References CountryList(CountryCode),
Name NOT NULL PRIMARY KEY
)
下表列出间谍有间谍大师这些国家的(单)头。并非所有国家都会出现在此列表中,但每个国家/地区只能出现一次。在这种情况下,CountryCode字段是UNIQUE - 但您不必明确声明,因为PRIMARY KEY总是包含唯一性。
1
该外键是另一个表中的属性。在原始表格(“参考表格”)中,外键应该是唯一的并且不是NULL
。事实上,它几乎总是这张桌子的主要关键。
在引用表中,如果始终需要值,则只应声明引用列不是 - NULL
。如果您不想重复,只应声明unique
。换句话说,它取决于参考表中的特性,而不是参考表。
相关问题
- 1. 选择行,而不是唯一的值应该是不同的
- 2. 空值不是唯一的
- 3. 删除多列唯一键而不丢弃外键?
- 4. 在两列上添加外键约束是安全的,而一个不是唯一的(MySQL)?
- 5. Android的SQLite PRIMARY KEY必须是唯一的例外,当主键是唯一的
- 6. 列塞不是唯一的
- 7. “主键应该是唯一的SQLite”错误
- 8. 下面的数据应该是外键还是主键?
- 9. 在sql server 2008中给外键而不是列外键
- 10. 唯一约束外键列
- 11. 外键是否可能是SQL函数而不是列?
- 12. 查询查找可能的应该是外键的列?
- 13. 引用的外键具有错误的列号。应该是2
- 14. 我应该使用外键的外键还是字符串值?
- 15. Httpruntime缓存键不是唯一的吗?
- 16. 空,而不是整数外键性能和空间考虑
- 17. nhibernate可以检查唯一的约束,而不是主键
- 18. 外键是否总是引用另一个表中的唯一键?
- 19. Char阵列不是空的时候应该是
- 20. JPA:列在其父代中应该是唯一的。
- 21. Django:创建一个不是主键唯一的列
- 22. 我应该返回一个空dict而不是None吗?
- 23. serialVersionUID对于不同的类应该是唯一的吗?
- 24. NHibernate应该总是写NULL而不是空字符串
- 25. user_id是不是唯一的
- 26. ResponseText应该是一个json_encode,而不是CakePHP中的HTML
- 27. 当它应该是一个int时,说“NULL”的外键?
- 28. 可能是唯一键(不是主键)是声明性外键约束的父项
- 29. transid应该是laravel中唯一的存储检查(value transid应该是单店)
- 30. 的Java获取异常而调用Web服务,但唯一的例外是空
这与Oracle SQL无关,与数据建模有关。在列可以为空或不为空的情况下,您可以有参照约束,并且它们通常是非唯一的,除非在1:1关系的情况下,在这种情况下,您会对其设置唯一约束。 –