SQL:复合主键,级联约束



我有3个表:A,B,C。

  • 表 A 包含以下属性:a(主键(
  • 表 B 包含以下属性:a、c(它们都组成一个复合主键(
  • 表 C 包含以下属性:c(主键(

当我删除 A 中的条目时,我应该如何设置约束以在级联上删除 B 的元素?(使用 Oracle DBMS(。

我试过这个:

ALTER TABLE A ADD CONSTRAINT constraint FOREIGN KEY (a) REFERENCES B (a) ON DELETE CASCADE

但是抛出下一个错误:

ORA-02270: no matching unique or primary key for this column-list

谢谢

编辑:

我在表 B 中添加了两个外键:

ALTER TABLE B ADD CONSTRAINT FOREIGN KEY (a) REFERENCES A (a) ON DELETE CASCADE
ALTER TABLE B ADD CONSTRAINT FOREIGN KEY (c) REFERENCES C (c) ON DELETE CASCADE

然后,我将删除表 B 中的元素,并且 A 和 C 中的条目也被删除。

要满足此要求,请执行以下操作:

然后,我将删除表 B 中的元素,并且 A 和 C 中的条目也被删除。

您需要通过添加外键约束使B表成为表AC的父表,该约束B表引用A表和C表。

请注意,引用列的数量必须与引用的列数匹配:

create table A(
  tab_id number primary key
);
create table B(
  col1 number,
  col2 number,
  constraint PK_Key primary key(col1, col2)
);
create table C(
  tab_id number primary key
);
alter table A add ( col1 number
                  , col2 number
                  , constraint fk_AB foreign key(col1, col2) 
                      references B(col1, col2) on delete cascade);
alter table C add ( col1 number
                  , col2 number
                  , constraint fk_CB foreign key(col1, col2) 
                      references B(col1, col2) on delete cascade);

有点猜测,但我假设表 BAC 的子表(也许BAC之间的桥接(或交叉引用(表,其中AC共享多对多关系(。

Table A  *---1  Table B  1---*  Table C  (* = many, 1 = one)

我还注意到您在识别FK中引入的FK(由于B(a)B主键的一部分(。

这使得表 A 成为此关系中的父级,B 成为子级。 根据我的经验,任何 FK 都需要添加到关系的子端(在本例中为表 B(。

我不是甲骨文专家,但这不是更有意义吗?...

ALTER TABLE B ADD CONSTRAINT constraint FOREIGN KEY (a) REFERENCES A (a) ON DELETE CASCADE

这应该删除所有引用您选择删除的任何A行的 PK 的B行。 但是,我不是甲骨文专家,所以只看表面价值,直到有甲骨文智慧的人可以证实(或轰炸(我的解释。

最新更新