请为我澄清两点:

外键可以为NULL吗? 外键可以被复制吗?

正如我所知道的那样,NULL不应该用于外键,但在我的一些应用程序中,我可以在Oracle和SQL Server中输入NULL,我不知道为什么。


当前回答

外键的思想是基于引用一个已经存在于主表中的值的概念。这就是为什么在另一个表中它被称为外键。这个概念被称为参考完整性。如果外键被声明为空字段,它将违反引用完整性的逻辑。它指的是什么?它只能引用主表中存在的内容。因此,我认为将外键字段声明为null是错误的。

其他回答

下面是一个使用Oracle语法的例子: 首先,让我们创建一个表COUNTRY

CREATE TABLE TBL_COUNTRY ( COUNTRY_ID VARCHAR2 (50) NOT NULL ) ;
ALTER TABLE TBL_COUNTRY ADD CONSTRAINT COUNTRY_PK PRIMARY KEY ( COUNTRY_ID ) ;

创建表PROVINCE

CREATE TABLE TBL_PROVINCE(
PROVINCE_ID VARCHAR2 (50) NOT NULL ,
COUNTRY_ID  VARCHAR2 (50)
);
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_PK PRIMARY KEY ( PROVINCE_ID ) ;
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_COUNTRY_FK FOREIGN KEY ( COUNTRY_ID ) REFERENCES TBL_COUNTRY ( COUNTRY_ID ) ;

这在Oracle中运行得非常好。注意第二个表中的COUNTRY_ID外键没有“NOT NULL”。

现在要向PROVINCE表中插入一行,只需指定PROVINCE_ID就足够了。但是,如果您选择指定一个COUNTRY_ID,那么它必须已经存在于COUNTRY表中。

这取决于这个外键在关系中扮演什么角色。

如果这个外键也是你的关系中的键属性,那么它不能为NULL 如果这个外键是关系中的一个普通属性,那么它可以为NULL。

1 -是的,因为至少SQL Server 2000。

2 -是的,只要它不是UNIQUE约束或链接到唯一索引。

默认情况下,对外键没有约束,外键可以为null和重复。

在创建表/修改表时,如果你添加了唯一性或非空的约束,那么只有它不允许空值/重复值。

我认为最好考虑一下表中可能存在的基数。 我们可以让最小的基数为0。当它是可选的时,相关表的元组的最小参与可以是零,现在你面临着外键值被允许为空的必要性。

但答案是,这完全取决于业务。