2012-03-09 12 views
12

Thay vì xóa hàng con và sau đó viết một câu lệnh sql khác để xóa hàng cha mẹ, tôi muốn sử dụng một câu lệnh sẽ thực hiện cả hai. FYI: chúng tôi sử dụng cơ sở dữ liệu Oracle.Xóa một hàng con và hàng cha với một tập lệnh SQL

Cập nhật: Tôi không có một đặc ân để làm DELETE CASCADE ON

+0

sử dụng DELETE TRÊN CASCADE trong hạn chế khóa ngoại quốc ur .. – Teja

Trả lời

12

Xác định các phím nước ngoài của bạn với cascading deletes. Sau đó, bạn chỉ cần xóa hàng "cha mẹ".

+1

Vâng, tôi không có đặc quyền để làm điều đó. – WowBow

+2

@WowBow - Sau đó, bạn cần hai câu lệnh 'DELETE' – Lamak

+1

Yêu cầu DBA làm điều đó ... – Teja

1

Nếu bạn luôn muốn xoá những đứa trẻ khi bạn xóa một hàng cha mẹ, bạn có thể khai báo ràng buộc khoá ngoại để Oracle không đứa trẻ xóa tự động

create table parent (
    parentID number primary key, 
    parentData varchar2(100) 
); 

create table child (
    childID number primary key, 
    parentID number references parent(parentID) on delete cascade, 
    childData varchar2(100) 
); 

ví dụ, sẽ tuyên bố một bảng phụ huynh và một bảng con và tự động xóa các hàng con khi bạn xóa hàng gốc. Nếu bạn không muốn điều đó được thực thi tự động hoặc bạn không thích sự phức tạp được thêm vào khi mọi thứ xảy ra "tự động" trong nền, có thể bạn đang mắc kẹt với việc sử dụng nhiều câu lệnh DELETE.

+0

Cảm ơn sự giúp đỡ của bạn. Mặc dù, tôi không có đặc quyền để tạo bảng hoặc để thực hiện một thay đổi để ON DELETE CASCADE. Bảng đã có hàng ngàn bản ghi. Vì vậy, tôi đã làm hai câu lệnh sql. – WowBow

0

Một cách nhàm chán, chúng tôi có trong cơ sở dữ liệu, không biết lý do, không sử dụng khóa ngoài làm hạn chế - có) để thực hiện việc này là tạo trình kích hoạt sau (hoặc trước) xóa.

Bạn sẽ phải viết một truy vấn xóa khác, nhưng chỉ trong trình kích hoạt.

Nhưng nếu bạn không thể đặt xóa thác, tôi không chắc chắn bạn có thể thêm trigger ...

1

Bạn chỉ có thể làm điều đó xấu - ví dụ, sử dụng gây nên.

create table parent 
(pid number, 
    constraint parent_pk 
    primary key (pid) 
    using index 
); 

create table child 
    (cid number, 
    pid number, 
    constraint child_pk 
    primary key(cid) 
    using index, 
    constraint child_fk 
    foreign key (pid) 
    references parent (pid) 
); 

create index child_fk on child (pid); 

create trigger fake_delete_cascade 
before delete on parent 
for each row 
begin 
    delete from child where pid = :old.pid; 
end; 
/

insert into parent values (1); 
insert into child values (1,1); 
commit; 
select count(*) from child; 
delete from parent where pid = 1; 
select count(*) from child; 
3
delete from 
(
select * from parent join child using (id) 
where id = 1 
) 

CẢNH BÁO! Sẽ chỉ xóa nơi cả hai hàng cha và con đều tồn tại. Sẽ KHÔNG xóa cha mẹ không có con cái

Các vấn đề liên quan