SQL外键列

时间:2010-08-24 12:31:04

标签: sql foreign-keys

如果我在SQL中使用ForeignKey,它是否总是必须使用我引用的表的所有列?

所以,例如。

表1

subjectID 名字 姓 电子邮件

表2:

车 图书 外键(SubjectID)

我可以只使用一列作为外键,还是总是需要获取所有列?

谢谢!

3 个答案:

答案 0 :(得分:1)

您只能使用所选列或所有列的组合作为外键。

答案 1 :(得分:1)

外键必须引用唯一键,通常是主键。

因此,如果父表的主键中有一列是您需要在外键中使用的唯一列。如果父表具有复合主键(即多个列),那么您需要子表中的所有这些列。

这是人们倾向于避免使用复合主键来支持代理键和唯一约束的一个原因。

这是一个有用的例子(使用Oracle,但它在所有类型的RDBMS中都是一样的)。首先,我们使用单列主键创建父表,并从子表中引用它。

SQL> create table t1 (id number not null, seqno number not null)
  2  /

Table created.

SQL> alter table t1 add constraint t1_pk primary key (id)
  2  /

Table altered.

SQL> create table t2 (id number not null, t1_id number not null, whatever varchar2(10) )
  2  /

Table created.

SQL> alter table t2 add constraint t2_t1_fk foreign key (t1_id)
  2             references t1 (id)
  3  /

Table altered.

SQL>

足够简单。但是,如果我们丢弃这些密钥并给T1一个复合主键,事情就会崩溃......

SQL> alter table t2 drop constraint  t2_t1_fk
  2  /

Table altered.

SQL> alter table t1 drop constraint  t1_pk
  2  /

Table altered.


SQL> alter table t1 add constraint t1_pk primary key (id, seqno)
  2  /

Table altered.

SQL> alter table t2 add constraint t2_t1_fk foreign key (t1_id)
  2             references t1 (id)
  3  /
           references t1 (id)
                          *
ERROR at line 2:
ORA-02270: no matching unique or primary key for this column-list


SQL> 

我们需要在子表中添加匹配的第二列,并将其包含在外键定义中:

SQL> alter table t2 add t1_seqno number
  2  /

Table altered.

SQL> alter table t2 add constraint t2_t1_fk foreign key (t1_id, t1_seqno)
  2             references t1 (id, seqno)
  3  /

Table altered.

SQL>

答案 2 :(得分:0)

简单来说,表的主键在其他表中用作外键。 我们不会将表的所有列用作其他表中的外键(这将再次导致冗余,这又是一个问题)。

此外,您可以将主键唯一键,主键+“其他列”等作为其他表中的外键。