Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

240
Visualizações
Desencadenador de PostgreSQL para actualizar el recuento de juegos al insertar/eliminar elementos de matriz

Quiero crear un activador en una tabla game_catalog para que cada vez que un usuario agregue o elimine un juego de su colección, se actualice el recuento total de juegos. Dado que la colección de juegos se almacena como una matriz de texto, decidí usar la función array_length para contar la cantidad de juegos.

catálogo_de_juegos

 id - BIGSERIAL primary key user_id - INTEGER game_list - text [] game_count - INTEGER

Intenté crear un activador para que vuelva a calcular la longitud de la columna game_list después de insertar o eliminar, pero no funciona. Esto es lo que tengo por ahora:

 CREATE OR REPLACE FUNCTION count_games() RETURNS TRIGGER AS $$ BEGIN UPDATE game_catalog SET game_count = (SELECT array_length(game_list, 1) from game_catalog) WHERE user_id = NEW.user_id; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER count_games AFTER INSERT OR DELETE ON game_catalog FOR EACH ROW EXECUTE PROCEDURE count_games();
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Entonces, un par de cosas:

  • No conozco su caso de uso exacto, pero parece una mala idea por varias razones
  • Asegúrese de tener una restricción única en su id_usuario o esto se complicará (ingrese en id_usuario para su actualización. Es mejor usar la clave principal si va a ingresar algo, pero no es realmente necesario, ya que mostrado) [EDITAR - no importa. Su consulta ha manejado esto. Pero actualiza todos los registros de ese usuario... lo que podría resultar costoso si hay duplicación...]
  • Si realmente desea que este elemento esté disponible para el usuario sin calcularlo (y dado que siempre hace referencia a la misma fila), me parece que realmente pertenece a una vista o vista materializada
  • Por lo general, las agregaciones desencadenantes son para agregaciones a nivel de tabla cuando se esperan muchos datos (es decir, no por registro) y vivirían en una tabla separada. Cuando está en la misma tabla, corre el riesgo de un bucle infinito (Actualizar una fila, activar una actualización, activar una actualización, etc.)
  • En general, debe hacerse muchas preguntas antes de usar una matriz o una columna json en el modelado de datos relacionales. Mientras sea posible, puede estar creando dolor para su yo futuro.
  • Para un activador DELETE, NUEVO no está definido (consulte los documentos de Postgres sobre funciones de activación, son muy útiles y tienen algunos buenos ejemplos)
  • Si edita el registro en sí mismo a medida que ingresa (más eficiente, ya que no tiene una consulta de selección en curso), necesita usar un disparador ANTES, ya que los disparadores DESPUÉS no pueden cambiar el valor de las cosas que ingresan a la tabla.

Dicho esto, puede definir su disparador de manera diferente para que funcione:

 -- only watch for insert/updates on the game_list column to avoid infinite loop -- delete doesn't matter here CREATE TRIGGER count_games BEFORE INSERT OR UPDATE OF game_list ON game_catalog FOR EACH ROW EXECUTE PROCEDURE count_games();

Aunque una vista sería mejor:

 CREATE OR REPLACE VIEW game_catalog_count AS SELECT id, user_id, game_list, array_length(game_list,1) as game_count FROM game_catalog;

Y su función de activación podría mejorar un poco (a menos que planee hacer referencia a otras filas... pero luego tenga otros problemas en el diseño de su función de activación):

 CREATE OR REPLACE FUNCTION count_games() RETURNS TRIGGER AS $$ BEGIN NEW.game_count := array_length(NEW.game_list, 1); RETURN NEW; END; $$ LANGUAGE plpgsql;

¡Espero que sea útil!

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda