Sql 如果外键是另一个表的主键,为什么它可以为null?
主键不能为null,这是一条规则。但是为什么外键可以?如果它也是另一个表的主键Sql 如果外键是另一个表的主键,为什么它可以为null?,sql,foreign-keys,Sql,Foreign Keys,主键不能为null,这是一条规则。但是为什么外键可以?如果它也是另一个表的主键 是因为它不是来自主表吗?外键的可空性由NULL约束决定。也就是说,外键可以是NULL,表示没有关系 当然,primary keys永远不能为NULL,因此没有将NULL值与匹配项混淆的危险。指向主键 外键可以指向其他/自身表的主键。如果它为null(或部分为null),则表示它没有被引用的行 指向唯一约束 外键也可以指向唯一约束;这些唯一的约束实际上可以为空。请看下面的示例: create table person
是因为它不是来自主表吗?外键的可空性由
NULL
约束决定。也就是说,外键可以是NULL
,表示没有关系
当然,
primary key
s永远不能为NULL
,因此没有将NULL
值与匹配项混淆的危险。指向主键
外键可以指向其他/自身表的主键。如果它为null(或部分为null),则表示它没有被引用的行
指向唯一约束
外键也可以指向唯一约束;这些唯一的约束实际上可以为空。请看下面的示例:
create table person (
id int primary key not null,
first_name varchar(20),
last_name varchar(20),
constraint uq1 unique (first_name, last_name)
);
insert into person (id, first_name, last_name) values (1, 'Peter', 'Cantropus');
insert into person (id, first_name, last_name) values (2, 'Chad', 'Ensis');
insert into person (id, first_name, last_name) values (3, null, null);
create table car (
brand varchar(30),
owner_first_name varchar(20),
owner_last_name varchar(20),
constraint fkoc1 foreign key (owner_first_name, owner_last_name)
references person(first_name, last_name)
);
insert into car (brand, owner_first_name, owner_last_name) values
('Renault', 'Peter', 'Cantropus');
insert into car (brand, owner_first_name, owner_last_name) values
('Lada', null, null);
insert into car (brand, owner_first_name, owner_last_name) values
('Sumi', 'Chad', null);
select * from car;
结果:
id first_name last_name
-- ---------- ---------
1 Peter Cantropus
2 Chad Ensis
3 <null> <null>
brand owner_first_name owner_last_name
------- ---------------- ---------------
Renault Peter Cantropus -- not null: has a referenced row
Lada <null> <null> -- null: not referencing
Sumi Chad <null> -- partially null: not referencing
id first\u name last\u name
-- ---------- ---------
1彼得·坎特罗普斯
2乍得恩西斯
3.
品牌所有者\名所有者\姓
------- ---------------- ---------------
雷诺·彼得·坎特罗普斯(Renault Peter Cantropus)——非空:有一个引用行
Lada--null:不引用
Sumi Chad--部分为null:不引用
如你所见:
- 只有完全非空外键引用另一个表中的行
- 部分空行不引用另一个表中的行(尽管在某些情况下可能会部分验证)
- 完全空的行也不引用另一个表中的行偶数,考虑到有一个唯一的键是(null,null)