繁体   English   中英

与检查约束中的另一个表相关吗?

[英]Relate to another table in a check constraint?

假设我有一个名为Stock_item的表,并且包含一个名为Price的列。我有另一个表表示Purchase的列名为Buying_Price 。现在,我想为Price设置一个约束,以便Price> Buying_Price

您不能使用SQL约束来做到这一点。 检查约束仅适用于单个表,外键仅强制执行相等性。

ANSI SQL标准包括一个称为断言的构造,该构造应该支持这种业务逻辑,但是没有DBMS供应商实现它们。 他们很难有效地完成工作。

我们可以使用before插入或更新触发器来模拟断言。 像这样:

  create or replace trigger stock_item_price
  before insert or update on stock_item
  for each row
  declare
       l_buy_price purchase.buying_price%type;
  begin
      select p.buying_price
      into l_buy_price
      from purchase p
      where p.item_code = :new.item_code;

      if l_buy_price <= :new.price 
      then
          raise_application_error(-20000
           , 'Price must exceed Buying_Price');
  end;

这带有一些警告。 因为它为每一行触发,所以在批量更新方案中效率很低。 它可能无法在多用户环境中工作(例如,如果有人未提交对PURCHASE的更改)。 而且它不会以其他方式执行任何操作; 如果有人提高BUYING_PRICE,则不会触发。 因此,也许您还需要购买另一个触发器。 但这可能不是理想的。

如您所见,触发器是执行应用程序逻辑的一种混乱方式,尤其是因为它们很容易被忽略。 程序API是一种更好的方法。 至少将逻辑放入存储的proc中,然后从触发器中调用它。


“可以检查价格> 0的约束”

哦,是的,这种验证检查约束适用于。

alter table stock_item 
     add constraint stock_item_price_chk 
         check ( Price > 0 )
/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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