Estou criando alguns gatilhos para armazenar a classificação média de um determinado produto na tabela de produtos. Também me pediram para armazenar o número total de avaliações do produto. Portanto, preciso recuperar 2 valores em meu gatilho e atualizar a tabela de destino adequadamente.
Devo usar instruções select separadas
SET my_a = SELECT a FROM foo;
SET my_b = SELECT b FROM foo;
uma única instrução para recuperar um conjunto de resultados como uma variável (isso é possível?):
SET var = SELECT (a,b) FROM foo;
UPDATE bar SET c=var.a,d=var.b;
ou talvez até armazenar o conjunto de resultados em uma tabela temporária dentro do gatilho ( isso é possível?)?
O primeiro método é o melhor devido à menor sobrecarga para as consultas geradas. Na verdade, na MySQL Stored Procedure Language, você deseja o mínimo possível de variáveis declaradas.
O segundo não é possível, pois o MySQL Stored Rrocedure Language não possui suporte a objetos. Um UPDATE JOIN desajeitado, mas funcional, é possível se você...
O terceiro método não é possível porque DDL explícito e DDL via SQL dinâmico não são permitidos em MySQL Triggers .
Você pode ter que criar uma tabela regular usando o mecanismo de armazenamento MyISAM ou MEMORY . Em seguida, você pode fazer com que o gatilho compile seus dados em uma tabela que realmente exista. MyISAM é melhor porque se um servidor cair, os dados compilados até agora estão no disco. As tabelas MEMORY são mais rápidas de gravar, mas desaparecem na reinicialização do sistema.
NÃO USE CREATE TEMPORARY TABLE porque essas tabelas duram apenas enquanto a conexão com o banco de dados existir e também seriam privadas para a chamada do gatilho. Pior ainda, se você estiver usando MySQL Replication e executar
STOP SLAVE
no slave, todas as tabelas criadas via CREATE TEMPORARY TABLE desaparecerão do SQL Thread e a replicação será interrompida imediatamente quando você executarSTART SLAVE
e essas tabelas temporárias não existirão mais.Esta é uma questão bastante antiga, então talvez essa sintaxe não existisse anteriormente, mas agora você pode simplesmente usar
SELECT INTO
:Acho que isso é esteticamente mais limpo do que a primeira sintaxe, e a consulta só terá que ser executada uma vez.