Mi pregunta es la siguiente:
Tengo una base de datos PostgreSQL con varias tablas, lo que quiero hacer es lo siguiente, les daré tres tablas como ejemplo.
La primera tabla se llama teachers que tiene atributos name , id y type donde el tipo solo puede ser "IN" o "EX"
Tengo una segunda tabla llamada internal teachers con el ID de todos los profesores con el atributo type = "IN" y otra tabla llamada external teachers con el atributo ID de todos los profesores donde type = "EX"
El caso es que en este momento tengo que agregar manualmente la ID a la tabla de internal teachers external teachers , quisiera saber si hay alguna forma de eso al momento de ingresar la ID del docente y su tipo a la tabla de teachers , la base de datos coloca automáticamente su ID en una tabla u otra dependiendo de su tipo.
Sin mas que decir un saludo y gracias!
Si desea la inserción automática en tablas internal y external , puede usar el disparador como se muestra a continuación:
Función de disparo
create or replace function trig_fun() returns trigger AS $$ begin if(new.type='IN') then insert into internal values(new.id); end if; if(new.type='EX') then insert into external values(new.id); end if; return new; end; $$ language plpgsql y adjúntelo after insert de la tabla del teacher
create trigger trig_on_insert after insert on teachers for each row execute procedure trig_fun()Puede implementar sus tablas 'internas' y 'externas' como vistas separadas de la tabla de profesores.
create table teachers as select * from (values ( 1, 'EX')) as z(id, type); create view external as (select * from teachers where type = 'EX'); create view internal as (select * from teachers where type = 'IN');La siguiente consulta:
select * from external;da:
(1, 'EX')Mientras que seleccionar de 'interno' da un resultado vacío (porque no hay entradas internas).
No hay una funcionalidad de Postgres que cree automáticamente una fila en una tabla secundaria al insertarla en la tabla principal. Las restricciones de clave externa imponen la integridad cuando los datos cambian y vienen con varias opciones, pero no con la que usted describe.
Una opción es escribir disparador. También podría ser explícito en la consulta, utilizando la sintaxis de returning de Postgres:
with t as ( insert into teachers(name, type) values (?, ?) returning * ), x as ( insert into teachers_internal(id) select id from t where type = 'IN' ) insert into teachers_external(id) select id from t where type = 'EX'También recomendaría crear claves externas, de modo que se tome la acción adecuada cuando las filas se eliminen de la tabla principal (probablemente también desee eliminar la fila secundaria).