una tabla resultado referencia otra into insertar ejemplo datos copiar consulta con columna ambigua postgresql triggers autofill

postgresql - tabla - INSERTAR un número en una columna basada en otras columnas INSERTOS ANTIGUOS



insertar el resultado de una consulta en otra tabla (1)

En un desencadenante AFTER INSERT , cualquier cambio que realice en NEW.time_index se ignorará. El registro ya está insertado en este punto; es demasiado tarde para modificarlo.

Crea el activador como BEFORE INSERT .

En PostgreSQL tengo esta tabla ... (hay una clave principal en el lado más izquierdo "timestamp02" que no se muestra en esta imagen, por favor no se moleste, no es importante a los fines de esta pregunta)

en la tabla anterior, todas las columnas se ingresan a través de consultas, excepto el "índice de tiempo" que me gustaría completar automáticamente mediante un activador cada vez que se llena cada fila.

Este es el código para crear la misma tabla (sin ningún valor) para que todos puedan crearla utilizando el panel de consulta SQL de Postgre.

CREATE TABLE table_ebscb_spa_log02 ( pcnum smallint, timestamp02 timestamp with time zone NOT NULL DEFAULT now(), fn_name character varying, "time" time without time zone, time_elapse character varying, time_type character varying, time_index real, CONSTRAINT table_ebscb_spa_log02_pkey PRIMARY KEY (timestamp02) ) WITH ( OIDS=FALSE ); ALTER TABLE table_ebscb_spa_log02 OWNER TO postgres;

Lo que me gustaría que el gatillo hiciera es:

INSERTE un número en la columna "time_index" basado en los valores INSERTed de las columnas "fn_name" y "time_type" en cada fila.

Si ambos ("fn_name" y "time_type") hacen una combinación (por ejemplo, Check Mails - Start) que no existe en ninguna fila anterior (arriba), entonces INSERT 1 en la columna "time_index",

Elif both ("fn_name" y "time_type") hacen una combinación que existe en alguna fila antes (arriba), luego INSERTAR el número que sigue al anterior (arriba) en la columna "time_index".

(Por favor mire la imagen de la tabla de ejemplo, este desencadenador producirá cada cuadrado resaltado en rojo)

He visto muchos videos tutoriales de PostgreSQL, he leído muchos manuales, incluidos estos

http://www.postgresql.org/docs/9.4/static/sql-createtrigger.html http://www.postgresql.org/docs/9.4/static/plpgsql-trigger.html

sin ningún resultado

Hasta ahora he intentado crear la función:

CREATE OR REPLACE FUNCTION on_ai_myTable() RETURNS TRIGGER AS $$ DECLARE t_ix real; n int; BEGIN IF NEW.time_type = ''Start'' THEN SELECT t.time_index FROM table_ebscb_spa_log02 t WHERE t.fn_name = NEW.fn_name AND t.time_type = ''Start'' ORDER BY t.timestamp02 DESC LIMIT 1 INTO t_ix; GET DIAGNOSTICS n = ROW_COUNT; IF (n = 0) THEN t_ix = 1; ELSE t_ix = t_ix + 1; END IF; END IF; NEW.time_index = t_ix; return NEW; END $$ LANGUAGE plpgsql;

Y esto para crear la consulta:

CREATE TRIGGER on_ai_myTable AFTER INSERT ON table_ebscb_spa_log02 FOR EACH ROW EXECUTE PROCEDURE on_ai_myTable();

Luego, cuando inserto manualmente los valores en la tabla, nada cambia (ningún mensaje de error) la columna time_index simplemente permanece vacía, ¿qué estoy haciendo mal?

Por favor, algún buen programador de PostgreSQL podría echarme una mano, realmente llegué a un punto de muerte en esta tarea, tengo más ideas.

Gracias por adelantado