Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Consiglio su integrazione di 2 DB mysql

    Ciao a tutti,
    non mi ero mai imbattuto in una situazione come questa e non ho idea di come uscirne; vi espongo il problema:
    ho due db, DB1 e DB2, che sono entrambe in produzione su due sistemi differenti e non ho la possibilità di gestirli io direttamente... quindi mi devo adattare

    Sul DB1 c'è tutta la lista dei clienti, sul DB2 c'è la lista dei clienti che hanno effettuato acquisti.

    Queste in breve le strutture:

    DB1
    Id1_AutoIncremental PIVA1_UniqueIndex NomeAzienda1
    100 012 Azienda1
    101 013 Azienda2
    103 014 Azienda3
    104 986 Azienda8


    DB2
    Id2_AutoIncremental PIVA2_UniqueIndex NomeAzienda2
    10 013 Azienda2
    11 986 Azienda8


    Il mio obiettivo è costruire una tabella DB3:

    DB3

    SuperId_AutoIncremental Id1_UniqueIndex Id2 PIVA
    1 100 null 012
    2 101 10 013
    3 103 null 014
    4 104 11 986



    Con questa SELECT riesco ad individuare tutti i record e a "ricostruirmi" lo schema perfettamente:

    codice:
    SELECT DB1.Id1, DB1.PIVA1, DB2.id2, DB2.PIVA2
    FROM   DB1 
           LEFT JOIN DB2 
              ON DB1.PIVA1 = DB2.PIVA2
    Per popolarmi il DB3 avevo pensato di includere la SELECT in una INSERT INTO:

    codice:
    INSERT INTO DB3 (DB3.Id1, DB3.PIVA1, DB3.id2, DB3.PIVA2)
        SELECT DB1.Id1, DB1.PIVA1, DB2.id2, DB2.PIVA2
        FROM   DB1 
               LEFT JOIN DB2 
                  ON DB1.PIVA1 = DB2.PIVA2
    però dalla seconda esecuzione mi da ovviamente errore, in quanto prova ad inserire di nuovo anche i record inseriti in precedenza... errore di duplicato sul campo Id1 (settato come UniqueIndex).


    Il problema non è tanto come popolare il nuovo DB3, ma piuttosto come gestire i successivi aggiornamenti in quanto, come anticipato sopra, i DB1 e DB2 sono in produzione e sfornano continuamente nuovi record.

    Grazie a tutti in anticipo e resto a disposizione per chiarimenti o altro.
    Buona serata

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    nella SELECT ci metti anche DB3 e valuti che sia Null il campo relazionato, piu o meno cosi
    codice:
    INSERT INTO DB3 ( Id1, PIVA1, id2, PIVA2 )
    SELECT 
    DB1.Id1, DB1.PIVA1, DB2.id2, DB2.PIVA2
    FROM 
    DB3 
    RIGHT JOIN 
    (
    DB1 
    LEFT JOIN 
    DB2 
    ON 
    DB1.PIVA1 = DB2.PIVA2
    ) 
    ON 
    DB3.PIVA1 = DB1.PIVA1
    WHERE 
    (((DB3.Id1) Is Null))
    ;
    Pero come ti comporti con

    - Eliminazioni da DB1
    - Eliminazioni da DB2
    - Clienti di DB2 Non presenti in DB1
    - Omocodia ( fai una ricerca su Wilkipedia )

    .
    Ultima modifica di nman; 12-02-2014 a 22:29

  3. #3
    Ciao nman,
    con la query che mi hai indicato però riesco solo ad aggiornare i nuovi record del DB1, mentre non aggiorna/aggancia i record presenti nel DB2.



    Quote Originariamente inviata da nman Visualizza il messaggio
    Pero come ti comporti con

    1 Eliminazioni da DB1
    2 Eliminazioni da DB2
    3 Clienti di DB2 Non presenti in DB1
    4 Omocodia ( fai una ricerca su Wilkipedia )
    1 e 2 non sono previste
    3 c'è una procedura che verifica se i clienti presenti su DB2 siano presenti su DB1
    4

    Grazie ancora

    Edit:mi spiego meglio...
    - se aggiungo un nuovo record nel DB1, la query funziona perfettamente, aggiornando la lista;
    - mentre se aggiungo un nuovo record nel DB2, quando eseguo la query non "aggancia" i dati appena inseriti al record con la stessa PIVA (presente nel DB1).
    Ultima modifica di marco vee; 13-02-2014 a 14:39

  4. #4
    Faccio un esempio così sarà più facile spiegarmi; questa è la situazione

    DB1

    Id1_AutoIncremental PIVA1_UniqueIndex NomeAzienda1
    100 012 Azienda1
    101 013 Azienda2
    103 014 Azienda3


    DB2
    Id2_AutoIncremental PIVA2_UniqueIndex NomeAzienda2
    10 013 Azienda2

    eseguo la query ed ottengo:

    DB3
    SuperId_AutoIncremental Id1_UniqueIndex Id2 PIVA
    1 100 null 012
    2 101 10 013
    3 103 null 014

    ---------------------------------------------------------------------------------------

    Ora aggiungo un nuovo record nel DB2 ed ottengo:


    DB1

    Id1_AutoIncremental PIVA1_UniqueIndex NomeAzienda1
    100 012 Azienda1
    101 013 Azienda2
    103 014 Azienda3


    DB2
    Id2_AutoIncremental PIVA2_UniqueIndex NomeAzienda2
    10 013 Azienda2
    11 014 Azienda3

    Eseguo la query:

    codice:
    INSERT INTO DB3 ( Id1, PIVA1, id2, PIVA2 )
    
    
    SELECT DB1.Id1, DB1.PIVA1, DB2.id2, DB2.PIVA2
    
    FROM DB3 
        RIGHT JOIN ( DB1 
            LEFT JOIN DB2 
                ON DB1.PIVA1 = DB2.PIVA2 ) 
            ON DB3.PIVA1 = DB1.PIVA1
    WHERE ((DB3.Id1) Is Null)
    ed ottengo la tabella non aggiornata:

    DB3
    SuperId_AutoIncremental Id1_UniqueIndex Id2 PIVA
    1 100 null 012
    2 101 10 013
    3 103 null 014

    invece di:
    DB3
    SuperId_AutoIncremental Id1_UniqueIndex Id2 PIVA
    1 100 null 012
    2 101 10 013
    3 103 11 014

    Mentre, se eseguo una semplice select, il risultato è corretto, e mi associa l'ultimo record inserito:
    codice:
    SELECT DB1.Id1, DB1.PIVA1, DB2.id2, DB2.PIVA2
    
    
    FROM   DB1 
           LEFT JOIN DB2 
              ON DB1.PIVA1 = DB2.PIVA2

  5. #5
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    è vero oltre all'INSERT devi fare anche un UPDATE
    codice:
    UPDATE 
    DB2 INNER JOIN DB3 ON DB2.PIVA2 = DB3.PIVA1 
    SET 
    DB3.Id2 = [DB2].[Id2], 
    DB3.PIVA2 = [DB2].[PIVA2]
    WHERE (((DB3.PIVA2) Is Null))
    __________________________________________________ ____________


    Quote Originariamente inviata da marco vee Visualizza il messaggio
    Mentre, se eseguo una semplice select, il risultato è corretto, e mi associa l'ultimo record inserito:
    codice:
    SELECT DB1.Id1, DB1.PIVA1, DB2.id2, DB2.PIVA2
    FROM   DB1 LEFT JOIN DB2 
    ON DB1.PIVA1 = DB2.PIVA2
    Certo, quella SELECT è il risultato finale che vuoi ottenere, ma ci sono delle complicazioni:

    Tu lo vuoi in una tabella quindi devi fare obbligatoriamente almeno 2 query ma potrebbereo anche essere di piu

    - La INSERT la abbiamo gia vista e ti inserisce i nuovi record di DB1
    - adesso hai anche la UPDATE per aggiornare i record di DB3 nel caso aggiungi in DB2 nuovi record
    - Poi ti mancheranno le Modifiche di record in DB1 ( sono forse escluse ?? )
    - Poi ancora le modifiche di record in DB2 ( sono forse escluse ?? )
    - Le eliminazioni in DB1 ( le hai gia escluse )
    - Le eliminazioni in DB2 ( anche queste le hai gia escluse )
    --- Non mi viene in mente altro

    __________________________________________________ _____________

    a questo punto io ripenserei a quel SuperId che metti in DB3, a cosa serve ??
    Perche se non ti serve a nulla allora sarebbe piu facile

    eliminare con DELETE i record difformi dalla tua select e lanciare solamente una INSERT

    oppure fare un DELETE massivo e rifare la INSERT massiva ( Di quanti record si tratta )

    oppure addirettura una SELECT ......... INTO DB3 FROM .............. che assomiglia moltissimo alla tua SELECT ma pero ti elimina e ricostruisce integralmente la tabella


    Ci sono molte soluzioni diverse in funzione dalla situazione
    la piu facile in assoluto è rinunciare alla Tabella DB3 e tenerti solo la SELECT che è sempre aggiornatissima in tempo reale


    .
    Ultima modifica di nman; 14-02-2014 a 01:40

  6. #6
    Grazie nman, l'update era quello che mi mancava

    Temporaneamente credo di tamponare con una soluzione del genere.
    Siccome i DB sono abbastanza popolati, credo di iniziare a orientarmi su qualche tecnologia di Master Data Mangement per gestire al meglio la situazione... avete esperienze o consigli a riguardo?

    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.