防止插入值取决于另一个表

问题描述 投票:0回答:3

假设我有一个名为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

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

我希望这不可能,因为在表MANT中,最古老的日期比在PREC中插入的日期的状态为0

但是如果我插入例如:

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

已经允许。

有人建议在SQL Server中执行此操作吗?

sql sql-server tsql join sql-insert
3个回答
0
投票

您可以使用insert ... select语法和相关子查询进行过滤:

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

0
投票

我相信您正在寻找引发异常的插入触发器。下面是一个示例:

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;

0
投票

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

CREATE PROCEDURE dbo.PREC_Insert 
@value INT
,@DateValue DATE
AS
BEGIN
    DECLARE @maxDate DATE = (
            SELECT max(DATE)
            FROM PREC
            )
    DECLARE @errorMessage NVARCHAR(4000)

    IF @Datevalue > @maxDate
    BEGIN
        SET @errorMessage = 'You cannot insert date value older than ' + CAST(@maxDate AS VARCHAR(12) 
        throw 51000, @errorMessage, 1;
    END 
    ELSE 
    BEGIN
        -- Do the insert
    END 

END

如果要允许直接插入,则可以使用AFTER INSERT触发器进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.