我有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
表成为表A
和C
的父表,该约束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);
有点猜测,但我假设表 B
是 A
和 C
的子表(也许B
是A
和C
之间的桥接(或交叉引用(表,其中A
和C
共享多对多关系(。
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
行。 但是,我不是甲骨文专家,所以只看表面价值,直到有甲骨文智慧的人可以证实(或轰炸(我的解释。