簡體   English   中英

Oracle SQL:對虛擬列的約束

[英]Oracle SQL: Constraint on virtual column

知道為什么這個約束似乎沒有被觸發嗎?

CREATE OR REPLACE FUNCTION UNITS_APPLY_CONVERSION_IND_CHECK (P_UNITS_REF_CODE VARCHAR2) RETURN NUMBER DETERMINISTIC IS

v_cnt NUMBER;

BEGIN


  SELECT Count(*)
  INTO  v_cnt
  FROM  wms.units
  WHERE units_ref_code = P_UNITS_REF_CODE
  AND apply_conversion_ind = 'Y';

  RETURN v_cnt;

END;

然后

ALTER TABLE UNITS ADD (UNITS_APPLY_CONVERSION_IND_Count NUMBER GENERATED ALWAYS AS (UNITS_APPLY_CONVERSION_IND_CHECK(units_ref_code)) VIRTUAL);

然后

ALTER TABLE UNITS
ADD CONSTRAINT UNITS_APPLY_CONVERSION_IND_Cons CHECK(UNITS_APPLY_CONVERSION_IND_Count <= 1);

然而,通過上述內容,我可以更新我想讓我的虛擬列超過 1 的任何行 - 約束並沒有阻止我。 有任何想法嗎?

在此處輸入圖片說明

它看起來像你只是想確保units_ref_code是在表時唯一apply_conversion_ind = 'Y' 假設是這種情況,您只需要一個基於函數的唯一索引。 您不需要函數或虛擬列。

create unique index idx_one_units_ref_code
    on units( case when apply_conversion_ind = 'Y'
                   then units_ref_code
                   else null
               end );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM