Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果外键是另一个表的主键,为什么它可以为null?_Sql_Foreign Keys - Fatal编程技术网

Sql 如果外键是另一个表的主键,为什么它可以为null?

Sql 如果外键是另一个表的主键,为什么它可以为null?,sql,foreign-keys,Sql,Foreign Keys,主键不能为null,这是一条规则。但是为什么外键可以?如果它也是另一个表的主键 是因为它不是来自主表吗?外键的可空性由NULL约束决定。也就是说,外键可以是NULL,表示没有关系 当然,primary keys永远不能为NULL,因此没有将NULL值与匹配项混淆的危险。指向主键 外键可以指向其他/自身表的主键。如果它为null(或部分为null),则表示它没有被引用的行 指向唯一约束 外键也可以指向唯一约束;这些唯一的约束实际上可以为空。请看下面的示例: create table person

主键不能为null,这是一条规则。但是为什么外键可以?如果它也是另一个表的主键


是因为它不是来自主表吗?

外键的可空性由
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)

MySQL、SQL Server还是SQLite?它们是3种不同的关系数据库-请仅标记感兴趣的关系数据库。@Irene。我删除了不一致的数据库标记。您应该只标记您真正使用的数据库——即使在这种情况下答案实际上并不依赖于数据库。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。也要问一个明确的非重复问题。此外,“为什么”不是一个有意义的问题——它没有明确的答案——问“什么”。而且“为什么”可能不是你真正想问的。在文章的最后两句话中,请明确提问你想谈论的内容。首先了解PKs和FKs是如何工作的。请参阅,其他链接&文本上方的投票箭头鼠标。等等