[英]SQL: Compare two data from different tables sql in a check statement
我有一个表“ 存货 ”与列“ 股票 ”和另一个表“bike_with_inventory”同列“ 输入 ”。 我正在使用Oracle APEX,但这没关系。
我只想做一个约束check(stock>=input)
以便我不能预定不存在的零件。
有什么建议么? 我找不到任何可以做的事情,因此我们将不胜感激。
我有一个带有“股票”列的表“库存”和一个带有“输入”列的表“ bike_with_inventory”。
我只想做一个约束检查(stock> = input),以便我不能预定不存在的零件。
您不能 CHECK
约束只能引用同一表中的列。
相反,您可以将逻辑包装在存储过程中,并使用该逻辑在INSERT
之前验证数据。
CREATE PROCEDURE book_part(
i_id IN BIKE_WITH_INVENTORY.ID%TYPE,
i_input IN BIKE_WITH_INVENTORY.INPUT%TYPE,
o_success OUT NUMBER
)
IS
p_stock INVENTORY.STOCK%TYPE;
BEGIN
SELECT stock
INTO p_stock
FROM inventory
WHERE id = i_id;
IF p_stock < i_input THEN
o_success := 0;
RETURN;
END IF;
INSERT INTO bike_with_inventory ( id, input )
VALUES ( i_id, i_input );
UPDATE inventory
SET stock = stock - i_input
WHERE id = i_id;
o_success := 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
o_success := 0;
END;
/
或者您可以使用触发器。
我相信您没有考虑正确的方法。 您确实需要CHECK CONSTRAINT ,而不只是在插入(或更新)时进行验证。
该约束应始终有效(返回TRUE),并且应防止对两个表进行“无效”更改。 如果没有充分减少BIKE_WITH_INVENTORY中的相应数量,则不应允许减少INVENTORY表中的数量。 不等式股票> =输入是否必须在所有时间都是正确的,而不仅仅是在最初插入BIKE_WITH_INVENTORY时是否为真?
实现这种检查约束的一种方法是创建一个物化视图,并在提交时快速刷新。 它应该具有三列:ID,STOCK和INPUT(从ID上两个表的联接中选择)。 在实例化视图上,您可以具有检查约束-在这种情况下,它将是STOCK> = INPUT。
MV将导致事务在COMMIT时失败-从某种意义上说这是不好的(您没有得到即时的反馈),而在另一种意义上是好的(您可以对两个表进行更改,并且如果最终结果是在FULL事务之后),是有效的,那么您可以提交并交易将成功)。
我不会在此显示如何工作; 在Google中搜索“实例化视图以实现多表约束”,然后查看返回的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.