Sql 引用另一个表中另一个已删除行的删除行触发器
我需要帮忙扣扳机。我正在Oracle中执行触发器,用于删除第一个表中的行,该表使用外键引用第二个表,其中删除的行的主键的值类似于第一个表中的外键 我有这些桌子: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)
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函数中,当时不要使用,而是使用IF、ELSE和END 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函数中,当时不要使用,而是使用IF、ELSE和END IF
但您不需要此触发器,请使用级联FK,因此您需要以这种方式创建表:
CREATE TABLE item2(
id_room NUMBER(5) NOT NULL,
.
.
FOREIGN KEY(id_room ) REFERENCES Room ON DELETE CASCADE;
);
永远不要使用这样的触发器,这是一种非常糟糕的方法。当
部分是有效语法时,。它定义触发器触发时的条件。它不是触发器主体的一部分。但是,当
部分的语法有效时,它确实需要在每行的之后。它定义触发器触发时的条件。它不是触发器主体的一部分。但是,它确实需要在每行的之后