阻止根据另一个表插入值

bybem2ql  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(332)

假设我有一张table叫 MANT 这样地

  1. date state
  2. 2020-01-24 | 0
  3. 2020-01-27 | 1

我还有一张table叫 PREC 这样地

  1. value date
  2. 0.00 | 2020-05-18
  3. 0.00 | 2020-05-19
  4. 0.00 | 2020-05-20

如果我尝试将这些值插入 PREC ```
insert into PREC VALUES (4,'2020-01-25')

  1. 我希望这是不可能的,因为在table `MANT` ,在插入日期的最早日期中状态为0 `PREC` 但如果我插入例如:

insert into PREC VALUES (4,'2020-01-29')

  1. 这已经被允许了。
  2. 有人建议在SQLServer中这样做吗?
92vpleto

92vpleto1#

你可以用这个 insert ... select 语法和用于筛选的相关子查询:

  1. insert into prec(value, date)
  2. select v.*
  3. from (values (4,'2020-01-25')) v(value, date)
  4. where (select top (1) m.date from mant m where m.date <= v.date order by m.date desc) = 1

您还可以通过聚合来实现这一点:

  1. insert into prec(value, date)
  2. select v.*
  3. from (values (4,'2020-01-25')) v(value, date)
  4. where (select max(m.date) from mant m where m.date <= v.date) = 1
kqlmhetl

kqlmhetl2#

我相信您正在寻找引发异常的插入触发器。例如:

  1. CREATE OR REPLACE TRIGGER person_id_trigg
  2. AFTER INSERT
  3. ON person
  4. FOR EACH ROW
  5. BEGIN
  6. IF( NOT EXISTS(select max(m.date) from mant m where m.date <= v.date AND state = 1) )
  7. THEN
  8. RAISE_APPLICATION_ERROR( -20001,
  9. 'The MANT date is invalid for PREC' );
  10. END IF;
  11. END;
slwdgvem

slwdgvem3#

我建议您不要允许直接插入。您可以通过存储过程来控制它。

  1. CREATE PROCEDURE dbo.PREC_Insert
  2. @value INT
  3. ,@DateValue DATE
  4. AS
  5. BEGIN
  6. DECLARE @maxDate DATE = (
  7. SELECT max(DATE)
  8. FROM PREC
  9. )
  10. DECLARE @errorMessage NVARCHAR(4000)
  11. IF @Datevalue > @maxDate
  12. BEGIN
  13. SET @errorMessage = 'You cannot insert date value older than ' + CAST(@maxDate AS VARCHAR(12)
  14. throw 51000, @errorMessage, 1;
  15. END
  16. ELSE
  17. BEGIN
  18. -- Do the insert
  19. END
  20. END

如果要允许直接插入,可以使用after insert触发器来处理。

展开查看全部

相关问题