我是否需要在一个表上删除外键以使用oracle删除另一个表上的行?

时间:2015-10-30 19:31:27

标签: oracle

我有两张桌子

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添加到子表中的外键中。所有文档都显示了在命名约束时如何更改表。我没有那种情况。有没有办法,或者我必须在我正在编写的删除语句中指定级联?

2 个答案:

答案 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
);