繁体   English   中英

SQL:在检查语句中比较来自不同表sql的两个数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM