0

我有 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 中的条目。

4

2 回答 2

1

为了满足这个要求:

然后,我将删除表 B 中的元素,同时删除 A 和 C 中的条目。

您需要使B表成为表的父表,AC通过添加外键约束来引用BAC表。

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

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);
于 2013-09-30T15:15:04.503 回答
0

这有点猜测,但我假设 tableB是两者的孩子Aand C(可能是andB之间的桥接(或交叉引用)表,其中A并共享多对多关系)。CAC

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

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

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

我不是 Oracle 专家,但这不是更有意义吗?...

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

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

于 2013-09-30T15:33:38.260 回答