用于检查两列

时间:2016-05-24 14:47:46

标签: sql database tsql

我的两个表的两列之间有一个外键。问题是,我还有一个"已删除"如果记录从我的UI设置为true,我认为该记录已删除。所以我的外键必须检查该列是否设置为true或false。

有没有办法做到这一点?我需要创建如下规则:"如果第一个表上有任何相关记录,请不要让第二个表的已删除列设置为false。"

如果以上内容有点过于复杂,这是一个很长的解释:

**Customer**      **StatusType**
Id               Id
Name             StatusName
Surname          Deleted
StatusId
Deleted

正如您所看到的,我有两个表,以及" StatusId" Customer表包含StatusType中的主键。所以我分配了一把外键将它们放在一起。

从我的界面,我从不删除数据库中的任何数据,我只是设置"删除"列到" true"。我只显示设置为" false"无论如何,在已删除的列上。

所以这就是问题:我的外键不能允许"删除" StatusType表的列设置为" false",如果Customer表上有相关的Customer.StatusId-StatusType.Id记录。

2 个答案:

答案 0 :(得分:1)

您可以使用触发器:

create trigger trg_upd_status before update on StatusType
for each row begin
    declare customer_count int;
    if new.Deleted = 'true' then
        select count(*)
        into   customer_count
        from   Customer
        where  Deleted = 'false';
        if (customer_count > 0) then
            signal sqlstate '45001' 
            set message_text = "Not allowed to delete this record";
        end if;
    end if;
end;
/

这假定已删除列的数据类型为varchar,但如果它是数字或有点......您可以轻松地进行调整...

请注意,这仅检查是否存在未删除的Customer条记录。因此,这意味着您还必须执行相反的操作:如果取消删除Customer记录,则相应的StatusType记录不应处于已删除状态。如果您更新Customer记录并更改StatusId,则相同。这将成为Customer表格的触发器......

答案 1 :(得分:0)

试试这个

update StatusType  set Deleted='false'
 where(select count (id) from customer where deleted='true' and StatusType.id=StatusId )=0