Sql 防止根据其他表插入值
假设我有一张像这样叫MANT的桌子Sql 防止根据其他表插入值,sql,sql-server,tsql,join,sql-insert,Sql,Sql Server,Tsql,Join,Sql Insert,假设我有一张像这样叫MANT的桌子 date state 2020-01-24 | 0 2020-01-27 | 1 我还有另一张桌子,叫PREC,像这样 value date 0.00 | 2020-05-18 0.00 | 2020-05-19 0.00 | 2020-05-20 如果我尝试在PREC中插入这些值 我希望这是不可能的,因为在表MANT中,插入PREC的最早日期中的state=0 但如果我插入例如: inse
date state
2020-01-24 | 0
2020-01-27 | 1
我还有另一张桌子,叫PREC,像这样
value date
0.00 | 2020-05-18
0.00 | 2020-05-19
0.00 | 2020-05-20
如果我尝试在PREC中插入这些值
我希望这是不可能的,因为在表MANT中,插入PREC的最早日期中的state=0
但如果我插入例如:
insert into PREC VALUES (4,'2020-01-29')
这已经被允许了
有人建议在SQL Server中执行此操作吗?您可以使用插入。。。选择用于筛选的语法和相关子查询:
insert into prec(value, date)
select v.*
from (values (4,'2020-01-25')) v(value, date)
where (select top (1) m.date from mant m where m.date <= v.date order by m.date desc) = 1
您还可以通过聚合执行此操作:
insert into prec(value, date)
select v.*
from (values (4,'2020-01-25')) v(value, date)
where (select max(m.date) from mant m where m.date <= v.date) = 1
我相信您正在寻找引发异常的插入触发器。例如:
CREATE OR REPLACE TRIGGER person_id_trigg
AFTER INSERT
ON person
FOR EACH ROW
BEGIN
IF( NOT EXISTS(select max(m.date) from mant m where m.date <= v.date AND state = 1) )
THEN
RAISE_APPLICATION_ERROR( -20001,
'The MANT date is invalid for PREC' );
END IF;
END;
我建议您不要允许直接插入。您可以通过存储过程来控制它 创建过程dbo.PREC_Insert @值INT ,@DateValue日期 像 开始 声明@maxDate日期= 选择maxDATE 来自PREC 声明@errorMessage NVARCH4000 如果@Datevalue>@maxDate 开始 SET@errorMessage='不能插入比'+CAST@maxDate如瓦查尔12 抛出51000,@errorMessage,1; 终止 其他的 开始 -插入 终止 终止
如果您想允许直接插入,可以使用插入后触发器来处理它。我认为问题是针对SQL Server RDBMS的。您的答案可能与RDBMS不同
CREATE OR REPLACE TRIGGER person_id_trigg
AFTER INSERT
ON person
FOR EACH ROW
BEGIN
IF( NOT EXISTS(select max(m.date) from mant m where m.date <= v.date AND state = 1) )
THEN
RAISE_APPLICATION_ERROR( -20001,
'The MANT date is invalid for PREC' );
END IF;
END;