Skip to main content
 首页 » 编程设计

甲骨文;限制每列值的行数

2024年11月01日56mate10pro

我有一个带有邮政编码列的表格(荷兰语格式,但没关系)

CREATE TABLE  "TEST" 
( 
    "ID" NUMBER(10) NOT NULL ENABLE, 
    "POSTALCODE" VARCHAR2(6) NOT NULL ENABLE, 
    .... 
    CONSTRAINT "TEST_PK" PRIMARY KEY ("ID") ENABLE 
) 

我正在尝试创建一个触发器来限制具有重复邮政编码的记录数量;一次只能有两行包含相同的邮政编码。 我尝试了以下代码:

CREATE OR REPLACE TRIGGER TR_TEST_PC 
    BEFORE UPDATE OR INSERT OF "POSTALCODE " ON "TEST" 
    FOR EACH ROW 
    WHEN ( OLD.POSTALCODE <> NEW.POSTALCODE ) 
DECLARE 
   v_count NUMBER; 
BEGIN 
    SELECT COUNT(*) 
    INTO v_count 
    FROM TEST 
    WHERE POSTALCODE = :NEW.POSTALCODE ;   
    IF (v_count > 2) THEN 
        raise_application_error(-20000, 'Max. 2 rows with same postal code.'); 
    END IF; 
END TR_TEST_PC; 

但这会返回一个错误:

ORA-04091: table MYDB.TEST is mutating, trigger/function may not see it 
ORA-06512: at "MYDB.TR_TEST_PC", line 4 
ORA-04088: error during execution of trigger 'MYDB.TR_TEST_PC' 

我知道这是因为您无法访问正在更改的表。

如何制作一个触发器来确保不超过 2 条记录包含相同的邮政编码?

请您参考如下方法:

这可能会代替你的触发器起作用:

CREATE MATERIALIZED VIEW mv_my 
BUILD IMMEDIATE 
REFRESH FAST ON COMMIT AS 
SELECT POSTALCODE, COUNT(*) AS cnt FROM TEST GROUP BY POSTALCODE 
/ 
 
ALTER TABLE mv_my ADD CHECK(cnt < 2) 
/ 

让我知道。 干杯,

塞巴斯