Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 引用另一个表中另一个已删除行的删除行触发器_Sql_Oracle_Plsql_Triggers - Fatal编程技术网

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

Sql 引用另一个表中另一个已删除行的删除行触发器,sql,oracle,plsql,triggers,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)

我需要帮忙扣扳机。我正在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
);
我有一个桌子房间,它有两个项目,所以当我删除他们的房间时,我需要删除这两个项目

现在我仅尝试删除一项:

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子句中写入该错误。
我需要一些删除这两项的指南。

在这种情况下,您不需要任何触发器。
只需在DELETE CASCADE上使用
子句:

关于删除的条款

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

如果希望Oracle删除依赖的外键,请指定级联 价值观

如果希望Oracle转换依赖的外键,请指定设置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   

在这种情况下,您不需要任何触发器。
只需在DELETE CASCADE上使用
子句:

关于删除的条款

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

如果希望Oracle删除依赖的外键,请指定级联 价值观

如果希望Oracle转换依赖的外键,请指定设置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   

触发器中的表达式不正确。触发器可以如下所示:

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函数中,当时不要使用,而是使用IFELSEEND IF

但您不需要此触发器,请使用级联FK,因此您需要以这种方式创建表:

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

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

触发器中的表达式不好。触发器可以如下所示:

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函数中,当
时不要使用,而是使用IFELSEEND IF

但您不需要此触发器,请使用级联FK,因此您需要以这种方式创建表:

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

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

部分是有效语法时,
。它定义触发器触发时的条件。它不是触发器主体的一部分。但是,当
部分的语法有效时,它确实需要在每行的
之后。它定义触发器触发时的条件。它不是触发器主体的一部分。但是,它确实需要在每行的
之后