【问题标题】:Oracle; limit rows per column value甲骨文;限制每列值的行数
【发布时间】:2014-01-13 00:28:56
【问题描述】:

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

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 条记录包含相同的邮政编码?

【问题讨论】:

  • 这两行之间是否存在关系——例如,一列总是“活动”,另一行“不活动”?只是想如果您有另一列只允许两个值之一,您可以在该字段和邮政编码上添加一个唯一索引。

标签: oracle triggers duplicates row


【解决方案1】:

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

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

告诉我。 干杯,

塞巴斯

【讨论】:

    【解决方案2】:

    我最终改用了更新后触发器:

    CREATE OR REPLACE TRIGGER TR_TEST_PC
        AFTER UPDATE OR INSERT OF "POSTALCODE" ON "TEST"
    DECLARE
        v_count NUMBER;
    BEGIN
        SELECT MAX(COUNT(*))
        INTO v_count
        FROM TEST
        GROUP BY POSTALCODE;
        IF (v_count > 2) THEN
            raise_application_error(-20000, 'Max. 2 rows with same postal code.');
        END IF;
    END TR_TEST_PC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多