AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 334895
Accepted
Tony Stephens
Tony Stephens
Asked: 2024-01-16 10:59:04 +0800 CST2024-01-16 10:59:04 +0800 CST 2024-01-16 10:59:04 +0800 CST

Criando um Trigger no MySQL que possui um JOIN

  • 772

PROBLEMA: Estou tentando criar um TRIGGER que irá copiar registros de 2 tabelas diferentes ( usuários , endereços ) no banco de dados A para uma única tabela ( usuários ) no banco de dados B.

Basicamente, estou tentando consolidar dados em uma única tabela em um banco de dados diferente.

Eu tenho o seguinte TRIGGER

CREATE TRIGGER `Copy db1_user to db2_users` 
AFTER INSERT ON `user`
FOR EACH ROW 
BEGIN 
    INSERT INTO database2.users(user_id, user_email, user_firstname, user_lastname) 
        VALUES (NEW.user_id, NEW.email, NEW.first_name, NEW.last_name);
END

O procedimento acima funciona bem, onde eu dobro meu cérebro para obter o outro pedaço de dados da tabela de endereços. Criei um diagrama do que estou tentando alcançar, espero que faça sentido. Ah, ele também precisa ter certeza de que o user_id ainda não existe na tabela de destino, o que não deveria acontecer, pois o campo user_id na tabela de origem é AUTO INCREMENT.

Diagrama de TRIGGER

Minha outra pergunta é: como as duas tabelas de origem são gravadas em momentos ligeiramente diferentes, não tenho certeza de onde disparar esse TRIGGER. Se eu ativá-lo AFTER INSERT na tabela (usuários), a tabela (endereços) já terá sido gravada? Não tenho certeza - não é meu código (é um aplicativo WordPress que estou analisando), então qualquer conselho sobre onde manter esse TRIGGER seria ótimo.

Sugestões ou assistência seriam muito apreciadas.

mysql
  • 1 1 respostas
  • 208 Views

1 respostas

  • Voted
  1. Best Answer
    Ergest Basha
    2024-01-16T17:23:47+08:002024-01-16T17:23:47+08:00

    Com 2 gatilhos você pode resolver o problema se seus esquemas estiverem no mesmo servidor.

    Isto pode ser conseguido usando INSERT....ON DUPLICATE KEY UPDATE.

    Gatilho1

    use database1;
    CREATE TRIGGER after_users_insert AFTER INSERT ON users
     FOR EACH ROW
       INSERT INTO database2.users (user_id,user_email,user_firstname,user_lastname,user_address1,user_address2,user_city,user_state,user_zip,user_country,user_phone) 
       VALUES (NEW.user_id,NEW.email,NEW.first_name,NEW.last_name,null,null,null,null,null,null,null) 
           ON DUPLICATE KEY UPDATE  user_email     = NEW.email      ,
                                    user_firstname = NEW.first_name ,
                                    user_lastname  = NEW.last_name  ;
    

    Gatilho2

    CREATE TRIGGER after_addresses_insert AFTER INSERT ON addresses
     FOR EACH ROW
       INSERT INTO database2.users (user_id,user_email,user_firstname,user_lastname,user_address1,user_address2,user_city,user_state,user_zip,user_country,user_phone) 
       VALUES (NEW.user_id,null,null,null,NEW.address_line_1,NEW.address_line_2,NEW.city,NEW.state,NEW.zip,NEW.country,NEW.phone) 
               ON DUPLICATE KEY UPDATE  user_address1 = NEW.address_line_1 ,
                                        user_address2 = NEW.address_line_2 ,
                                        user_city     = NEW.city           ,
                                        user_state    = NEW.state          ,
                                        user_zip      = NEW.zip            ,
                                        user_country  = NEW.country        ,
                                        user_phone    = NEW.phone          ;
    

    consultar exemplo

    Nota , usei nullpara as colunas que não estão presentes.


    Outro método é testar se user_idexiste e depois atualizar, caso contrário faça um insert com todas as colunas presentes na userstabela em database2.

    Gatilho1

    use database1;
    
    CREATE TRIGGER after_users_insert AFTER INSERT ON users
     FOR EACH ROW
      BEGIN
        IF EXISTS (SELECT user_id FROM  database2.users WHERE user_id = NEW.user_id )
         THEN 
           UPDATE database2.users SET user_email     = NEW.email     ,
                                      user_firstname = NEW.first_name,
                                      user_lastname  = NEW.last_name ;
          ELSE
             INSERT INTO database2.users (user_id,user_email,user_firstname,user_lastname,user_address1,user_address2,user_city,user_state,user_zip,user_country,user_phone) 
              VALUES (NEW.user_id,NEW.email,NEW.first_name,NEW.last_name,null,null,null,null,null,null,null);
        END IF;
      END;
    

    Gatilho2

    CREATE TRIGGER after_addresses_insert AFTER INSERT ON addresses
     FOR EACH ROW
      BEGIN
       IF EXISTS ( SELECT user_id FROM  database2.users WHERE user_id = NEW.user_id )
         THEN 
             UPDATE database2.users SET user_address1 = NEW.address_line_1 ,
                                        user_address2 = NEW.address_line_2 ,
                                        user_city     = NEW.city           ,
                                        user_state    = NEW.state          ,
                                        user_zip      = NEW.zip            ,
                                        user_country  = NEW.country        ,
                                        user_phone    = NEW.phone          ;
         ELSE
             INSERT INTO database2.users (user_id,user_email,user_firstname,user_lastname,user_address1,user_address2,user_city,user_state,user_zip,user_country,user_phone) 
             VALUES (NEW.user_id,null,null,null,NEW.address_line_1,NEW.address_line_2,NEW.city,NEW.state,NEW.zip,NEW.country,NEW.phone) ;
       END IF;
      END;
    

    consultar exemplo

    • 2

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve