【发布时间】: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