数据库被引用列能否含重复值?主键引用列能否存NULL与重复值?
嘿,咱们逐个来解决你的数据库问题,说得直白点:
问题1:数据库中的被引用列是否允许包含重复值?
当然允许!被引用列(也就是外键指向的目标列)本身没有强制要求唯一,除非你给它加了UNIQUE约束或者把它设为主键。外键的核心作用只是保证引用表中的值必须在被引用表中存在,完全不限制被引用列的值重复。举个例子:如果有个products表,其中category_id外键指向categories表的id,那一个分类下可以有N个产品,categories.id要是主键不能重复,但如果被引用列不是主键/唯一约束,重复值完全合法。
问题2:T1的A列(主键)引用T2的B列,B列能否包含NULL和重复值?给出的例子是否可行?
咱们拆成两部分说:
- NULL值的情况:T2的B列可以包含NULL,但有个关键限制:T1的A列是主键,主键的规则就是非空且唯一,所以T1里绝对不能出现
A=NULL的行——哪怕T2.B有NULL,你也没法在T1中引用这个NULL值,因为违反了主键的非空约束。 - 重复值的情况:T2的B列完全可以包含重复值,外键不限制这个。只要T1.A里的每一个非NULL值都能在T2.B中找到对应就行,哪怕T2.B里同一个值出现多次。
再看你给出的例子:
列B 列A 111 111 222 222 333 333 111 NULL
这里最后一行的列A=NULL是完全不可行的!因为T1.A是主键,主键不允许NULL值,这一行根本插不进T1表。而T2.B里的111重复是没问题的,前几行的引用关系也合法,唯独最后一行违反了主键约束。
内容的提问来源于stack exchange,提问作者ShippyDippy
相关产品推荐
相关产品推荐

