假设我有 3 张桌子,并从父母到孩子排序:
Table A
(专栏AId
)Table B
(列BId
、AId
)Table C
(列 CId
、AId
、BId
)Table B.AId
正在引用 Table A.AId
。
Table C.BId
链接到 Table B.BId
并且 Table C.AId
链接到 Table B.AId
- 而不是 Table A.AId
。
我可以知道这是否是正确的标准吗?解释更多信息。
答案可能取决于您实际使用的数据库。
我使用 Oracle,从它的角度来看,你的方法行不通,因为外键 必须引用另一个表中的主(或唯一)键。
这意味着前两个表可以毫无问题地创建:
SQL> create table table_a
2 (aid number primary key);
Table created.
SQL> create table table_b
2 (bid number primary key,
3 aid number references table_a (aid));
Table created.
但是,
table_c
会失败,因为aid
试图引用table_b.aid
,但该列不是table_b
中的主键:
SQL> create table table_c
2 (cid number primary key,
3 bid number references table_b (bid),
4 aid number references table_b (aid));
aid number references table_b (aid))
*
ERROR at line 4:
ORA-02270: no matching unique or primary key for this column-list
但是,如果
table_c.aid
引用table_a.aid
(主键列),则一切正常:
SQL> create table table_c
2 (cid number primary key,
3 bid number references table_b (bid),
4 aid number references table_a (aid));
Table created.
替代方法(尽管这不是您所描述的)是复合主键(然后是外键):
SQL> drop table table_c;
Table dropped.
SQL> drop table table_b;
Table dropped.
复合主键:
SQL> create table table_b
2 (bid number,
3 aid number references table_a (aid),
4 --
5 constraint pk_b primary key (bid, aid));
Table created.
table_c
仍然无法引用table_b
的专栏单独:
SQL> create table table_c
2 (cid number primary key,
3 bid number references table_b (bid),
4 aid number references table_b (aid));
bid number references table_b (bid),
*
ERROR at line 3:
ORA-02270: no matching unique or primary key for this column-list
复合外键就可以了:
SQL> create table table_c
2 (cid number primary key,
3 bid number,
4 aid number,
5 --
6 constraint fk_cb foreign key (bid, aid) references table_b (bid, aid));
Table created.
SQL>
如果您的数据库支持引用any列的外键(不必是主键/唯一键),您可能能够创建这样的数据模型。这是对的吗?不知道,你应该知道为什么要以这种方式引用列。如果是我,我会参考
table_a.aid
中的table_c.aid
。