我有两张桌子
Parent table
(account_number varchar(15) not null,
branch_name varchar(50) not null,
balance number not null,
primary key(account_number));
Child table
account_number varchar(15) not null,
foreign key(account_number) references parent table(account_number));
我正在尝试这个:
DELETE FROM parent table
WHERE balances > 1000;
我正在通过父母的余额删除帐户,但我收到有关子关系的错误消息。
我的假设是必须将DELETE CASCADE添加到子表中的外键中。所有文档都显示了在命名约束时如何更改表。我没有那种情况。有没有办法,或者我必须在我正在编写的删除语句中指定级联?
答案 0 :(得分:0)
Oracle中的每个约束都有一个名称。如果在创建约束时未指定名称,Oracle将自动生成约束的名称。如果您不知道约束的名称是什么,请尝试运行违反约束的SQL语句并从错误消息中读取约束名称:
SQL> delete from parent where account_number = 1234;
delete from parent where account_number = 1234
*
ERROR at line 1:
ORA-02292: integrity constraint (LUKE.SYS_C007357) violated - child record
found
在这种情况下,约束的名称为SYS_C007357
。
如果这不起作用,您可以查询数据字典视图user_constraints
:
SQL> select constraint_name from user_constraints where table_name = 'CHILD' and constraint_type = 'R';
CONSTRAINT_NAME
------------------------------
SYS_C007357
据我所知,您无法修改外键约束以启用ON DELETE CASCADE
。相反,您必须删除约束并重新创建它。
我不相信您可以将CASCADE
选项应用于DELETE
语句,但您可以在从父项删除之前删除子行:
DELETE FROM child
WHERE account_number IN (SELECT account_number FROM parent WHERE balance > 1000);
DELETE FROM parent
WHERE balance > 1000;
但是,我不知道有多少其他表有外键约束引用你的父表,也不知道你从父表中删除了多少个地方,所以我不知道它会有多少工作使用这种方法。
答案 1 :(得分:0)
yes you can set DELETE CASCADE see more info here FOREIGN KEYS WITH CASCADE DELETE
CREATE TABLE table_name
(
column1 datatype null/not null,
column2 datatype null/not null,
...
CONSTRAINT fk_column
FOREIGN KEY (column1, column2, ... column_n)
REFERENCES parent_table (column1, column2, ... column_n)
ON DELETE CASCADE
);
for example
CREATE TABLE supplier
( supplier_id numeric(10) not null,
supplier_name varchar2(50) not null,
contact_name varchar2(50),
CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)
);
CREATE TABLE products
( product_id numeric(10) not null,
supplier_id numeric(10) not null,
CONSTRAINT fk_supplier
FOREIGN KEY (supplier_id)
REFERENCES supplier(supplier_id)
ON DELETE CASCADE
);