Sql 使用触发器防止删除满足另一个表中条件的行的最佳方法是什么?

Sql 使用触发器防止删除满足另一个表中条件的行的最佳方法是什么?,sql,postgresql,join,sql-delete,database-trigger,Sql,Postgresql,Join,Sql Delete,Database Trigger,我想创建一个触发器,以防止在表_2中具有相同表_1ID的行满足条件时删除表_1中的行(表_2.status='ON') 我不担心一次删除多行 最好的办法是什么 提前感谢。这里有一种方法: create or replace function func_delete_table1() returns trigger as $$ begin if exists (select 1 from table2 where table1_id = old.id and status = 'ON')

我想创建一个触发器,以防止在表_2中具有相同表_1ID的行满足条件时删除表_1中的行(表_2.status='ON')

我不担心一次删除多行

最好的办法是什么

提前感谢。

这里有一种方法:

create or replace function func_delete_table1()
returns trigger as 
$$
begin
    if exists (select 1 from table2 where table1_id = old.id and status = 'ON') then
        raise exception 'Cannot delete id % from table1 because the corresponding record in table2 has status ON', new.id;
    end if;
end
$$ language 'plgpsql';

create trigger trg_delete_table1 before delete on table1_id
for each row execute procedure func_delete_table1();
请注意,正如DanielG所评论的,您还可以在
delete
语句中实现整个逻辑:

delete from table1 t1
where 
    id = ?
    and not exists (select 1 from table2 t2 where t2.table1id = t2.id and t2.status = 'ON')

表1中的DELETE语句可以连接到ID上的表2,并且可以添加where条件,其中table2.status为“on”。这将删除状态为“ON”的所有行。这是否符合您的要求?@DanielG我不是要删除行,而是要创建一个触发器,防止删除表_1中的行(如果它有表_2)。每当尝试删除时,状态为“开”。@DanielG非常感谢您的帮助。