我的两个表的两列之间有一个外键。问题是,我还有一个"已删除"如果记录从我的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记录。
答案 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