0

我有一个要求......假设我们有三个表

1.A
primary key a_id

2.B
primary key b_id
foreign key a_id

3.C
primary key c_id
foreign key b_id

这些表包含10 records每个。
需要:现在我想从每个表中删除一条特定记录。该记录将在作为 a_id(表 A 的主键)提供的值上删除。它将从 A 中删除,但我如何才能像它一样从 c 中删除它不包含 a_id,这是我们唯一知道的值。

那么怎么做...谁能告诉我不方法或任何东西。我需要从每个表中删除一个特定的记录。起点是a_id,这是我们唯一知道的。

我正在使用 oracle 10g,我不能使用任何 sys 表。这是一个要求,因为 dba 已授予管理员访问权限。

4

3 回答 3

1

您可以在ON DELETE CASCADE 选项的帮助下完成

这里

于 2013-01-18T08:37:23.067 回答
0
CREATE TABLE A (a_id NUMBER, CONSTRAINT a_pk PRIMARY KEY (a_id));

CREATE TABLE B
(
   b_id   NUMBER
  ,a_id
  ,CONSTRAINT b_pk PRIMARY KEY (b_id)
  ,CONSTRAINT b_fk FOREIGN KEY (a_id) REFERENCES A (a_id)
);

CREATE TABLE C
(
   C_id   NUMBER
  ,b_id
  ,CONSTRAINT c_pk PRIMARY KEY (c_id)
  ,CONSTRAINT c_fk FOREIGN KEY (b_id) REFERENCES B (b_id)
);

--creating dummy data
insert into A select level  from dual connect by level<11 ;
insert into B(b_id,a_id) select level+10,level from dual connect by level<11;
insert into C(c_id,b_id) select level+20,level+10 from dual connect by level<11;

CREATE OR REPLACE PROCEDURE delete_a(p_a_id IN a.id%TYPE)
IS 
 BEGIN
    --delete record from C first 
     DELETE FROM C WHERE b_id IN (SELECT b_id from B where a_id =p_a_id);
    --delete record from B 
     DELET FROM B WHERE a_id = p_a_id;
    --delete from the main table
     DELETE FROM C where a_id = p_a_id;
 COMMIT;
 EXCEPTION 
 WHEN OTHERS THEN 
 DBMS_OUTPUT.PUT_LINE('Error while delete the recods '||SQLERRM);
 ROLLBACK;
 END delete_a;

注意:我没有测试过代码,但会使用这种方法

于 2013-01-18T08:36:18.240 回答
0

我使用表格脚本如下:

CREATE TABLE A (a_id NUMBER CONSTRAINT a_pk PRIMARY KEY,a_grade CHAR(1));
CREATE TABLE b
     (    b_id    NUMBER ,
          b_grade CHAR(1),
          CONSTRAINT b_pk PRIMARY KEY(b_id),
          CONSTRAINT b_fk FOREIGN KEY (b_id) REFERENCES A(a_id) 
          ON DELETE CASCADE );
CREATE TABLE c
     (    c_id    NUMBER,
          c_grade CHAR(1),
          CONSTRAINT c_pk PRIMARY KEY(c_id),
          CONSTRAINT c_fk FOREIGN KEY(c_id)
          REFERENCES b(b_id)
          ON DELETE CASCADE );

BEGIN
INSERT INTO A VALUES(1,'a');
INSERT INTO b VALUES(1,'b');
INSERT INTO c VALUES(1,'c');
end;

/*below is the query that you provide in the table a to delete */

DELETE FROM A WHERE a_id=1;-- all tables values are deleted (parent and childs)

SELECT * FROM A;
SELECT * FROM b;
SELECT * FROM c;

希望这是你需要的。

于 2013-01-18T09:06:24.323 回答