触发删除行,引用另一个表中另一个已删除的行

时间:2016-04-28 19:37:33

标签: sql oracle plsql triggers

我的触发器需要帮助。我在Oracle中执行触发器,在第一个表中删除行,外国人键引用第二个表,其中删除了主键,其值为第一个表中的外键。

我有这些表格:

CREATE TABLE Room (
   id_room NUMBER(5) NOT NULL,
   .
   .
   price VARCHAR(10) NOT NULL,

   PRIMARY KEY(id_mistnosti),

 );

CREATE TABLE item1 (
  id_room NUMBER(5) NOT NULL,
  .
  .

  FOREIGN KEY(id_room) REFERENCES Room
);

CREATE TABLE item2(
  id_room  NUMBER(5) NOT NULL,
  .
  .
  FOREIGN KEY(id_room ) REFERENCES Room
);

我有桌子,有2个项目,所以当我删除他们的房间时我需要删除这两个项目。

现在我尝试只删除一个项目:

CREATE OR REPLACE TRIGGER removeRoomsItems
BEFORE DELETE ON Room
FOR EACH ROW
WHEN (:Room.id_mistnosti = :item1.id_mistnosti)
BEGIN
  DELETE FROM item1;
END;
/

我的SQLdeveloper写道错误在WHEN条款中。 我需要一些指南来删除这两个项目。

2 个答案:

答案 0 :(得分:2)

触发器中的表达很糟糕。触发器可能如下所示:

CREATE OR REPLACE TRIGGER removeRoomsItems
BEFORE DELETE ON Room
FOR EACH ROW
BEGIN
  DELETE FROM item1 WHERE id_room = :old.id_room ;
END;

在pl / sql函数中,不要使用 WHEN ,而是使用 IF ELSE END IF ;

但是你不需要这个触发器,使用级联FK,所以你需要这样创建表:

CREATE TABLE item2(
  id_room  NUMBER(5) NOT NULL,
  .
  .
  FOREIGN KEY(id_room ) REFERENCES Room ON DELETE CASCADE;
);

永远不要使用这样的触发器,这是非常糟糕的方式。

答案 1 :(得分:0)

在这种情况下,您不需要任何触发器 只需使用ON DELETE CASCADE子句:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm

  

ON DELETE子句
  
ON DELETE子句允许您确定Oracle的方式   如果删除a,数据库会自动维护引用完整性   引用主键或唯一键值。如果你省略这个条款,那么   Oracle不允许您删除引用的键值   在子表中具有从属行的父表。

     

如果希望Oracle删除相关外键,请指定 CASCADE   值。

     

如果希望Oracle转换从属外键,请指定 SET NULL   值为NULL。

见这个简单的例子:

CREATE TABLE Room (
   id_mistnosti int,
   id_room NUMBER(5) NOT NULL,
    price VARCHAR(10) NOT NULL,
   PRIMARY KEY(id_mistnosti)
 );

CREATE TABLE item1 (
  id_room NUMBER(5) NOT NULL,
  item_name varchar(100),
  FOREIGN KEY(id_room) REFERENCES Room ON DELETE CASCADE
);

CREATE TABLE item2(
  id_room  NUMBER(5) NOT NULL,
  item_name varchar(100),
  FOREIGN KEY(id_room ) REFERENCES Room ON DELETE CASCADE
);

insert into room values( 1, 1, 100 );
insert into room values( 2, 2, 200 );

insert into item1 values( 1, 'room 1' );
insert into item1 values( 1, 'room 11' );
insert into item1 values( 2, 'room 2' );
insert into item1 values( 2, 'room 22' );

insert into item2 values( 1, 'room 1' );
insert into item2 values( 1, 'room 11' );
insert into item2 values( 2, 'room 2' );
insert into item2 values( 2, 'room 22' );

commit;

现在:

SELECT * FROM item2;

  ID_ROOM ITEM_NAME
---------- ----------
         1 room 1    
         1 room 11   
         2 room 2    
         2 room 22 

删除房间并查看此删除对项目的影响:

delete from room where id_mistnosti = 1;

select * from item2;

   ID_ROOM ITEM_NAME
---------- ----------
         2 room 2    
         2 room 22