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

标签 oracle triggers duplicates row

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

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)
/

让我知道。 干杯,

塞巴斯

关于甲骨文;限制每列值的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20766378/

相关文章:

javascript - 搜索没有重复的数组 React.js

sql - 需要 Oracle sql 查询来对日期进行分组

mysql - 在 mysql 中更新触发器后触发并将该数据插入 mongodb

mysql - MYSQL 中的 "Error Code: 1109. Unknown table ' 排行榜 ' in field list"

sqlite - 使用触发器自动递增

python - 处理 Pandas 中的重复日期

javascript - 如何检查对象数组是否具有具有更多属性的重复属性值?

java - 如何在 org.hibernate.type.TimestampType 和 Oracle SYSDATE 之间进行转换?

sql - count (*) 和 count(attribute_name) 有什么区别?

php - 客户端上的php或javascript可以链接到远程服务器数据库吗?