2015-10-30 41 views
0

我有两个表我是否需要在一个表上删除一个外键以删除另一个使用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必须被添加到子表中的外键。所有文档都显示如何在约束命名时更改表格。我没有这种情况。有没有办法做,或者我必须在我写的删除语句中指定级联?

回答

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; 

不过,我不知道有多少其他表与外键约束引用您的父表,以及您要从父表中删除多少个位置,所以我不能说使用这种方法会有多少工作。

0

是的,你可以设置DELETE CASCADE 看到这里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 
); 

更多信息例如

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 
); 
相关问题