我試圖使用觸發器來檢查當我在我的表「歷史」插入數據,我需要檢查插入之前,如果表「行」的表的某一行有與我插入的數據相同的IDU。我已經使用這個觸發這個功能,但我不能讓它工作..Postgresql,檢查插入時觸發錯誤
那其下了扳機:
CREATE TRIGGER VerificarInsercion
BEFORE INSERT ON public."Historial"
FOR EACH ROW
EXECUTE PROCEDURE VerificarHistorial();
(我試着刪除「FOR EACH ROW 」,因爲我要的是爲每一行只有一次,不能運行)
最後,我的功能verificarhistorial():
BEGIN
IF (SELECT Count (*) FROM public."Historial" WHERE estado = 1 AND "IDU" = NEW."IDU") < 1 THEN
INSERT INTO public."Historial" (usuario, vehiculo, mercancia, "combustibleInicial", ruta, "horaSalida", estado, "IDU", fecha)
VALUES (NEW.usuario, NEW.vehiculo, NEW.mercancia, NEW."combustibleInicial", NEW.ruta, NEW."horaSalida", NEW.estado, NEW."IDU", NEW.fecha);
END IF;
RETURN null;
END;
當我在 「講史」 插入一些數據:
INSERT INTO public."Historial" (usuario, vehiculo, mercancia, "combustibleInicial", ruta, "horaSalida", estado, "IDU", fecha) VALUES ('David', '3424SDA', 200, 50, 'Cáceres-Sevilla', 'dom, 3 sep, 05:20 PM', 1, 50, '2017-09-03T15:21:07.442Z')
我得到這個錯誤:
ERROR: stack depth limit exceeded
HINT: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.
CONTEXT: SQL statement "SELECT (SELECT Count (*) FROM public."Historial" WHERE estado = 1 AND "IDU" = NEW."IDU") < 1"
PL/pgSQL function verificarhistorial() line 2 at IF
SQL statement "INSERT INTO public."Historial" (usuario, vehiculo, mercancia, "combustibleInicial", ruta, "horaSalida", estado, "IDU", fecha)
VALUES (NEW.usuario, NEW.vehiculo, NEW.mercancia, NEW."combustibleInicial", NEW.ruta, NEW."horaSalida", NEW.estado, NEW."IDU", NEW.fecha)"
PL/pgSQL function verificarhistorial() line 3 at SQL statement
我也檢查過其他類似的反應,沒有結果。
一些想法,使一個函數,檢查是否有任何行有相同的IDU插入數據?
你不需要一個觸發器,只需在該字段上創建一個UNIQUE INDEX。您無法在創建觸發器的表上進行選擇。 –
是的,但是,IDU可以在表上覆制,只有一行可以具有「estado」== 1和相同的IDU,但其他行可以具有相同的IDU但「estado == 0」 –
您需要創建在INSERT觸發器之後。 –