Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Datenabgleich

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von tibi38, 5 März 2013.

  1. tibi38

    tibi38 Benutzer

    Hallo,
    ein allgemeines Problem beschäftigt mich:

    In einer Tabelle A gibt es eine Reihe von Daten (1,3,5,7)
    In einer anderen Tabelle B gibt es auch Daten (1,2,3,4,5)
    Nun möchte ich, das die Tabelle A genauso aussieht wie B. Also 1,3,5 behalten, 2,4 einfügen und 7 löschen.
    Wie kann ich dies am besten (Pflegeleicht, Performance) machen?
    Danke
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Truncate & Insert in einer Transaktion? Oder sind die via Fremdschlüssel referrenziert?

    Andreas
     
  3. tibi38

    tibi38 Benutzer

    Hallo Andreas,
    das komplette Löschen wollte ich vermeiden. Da in den Clients die Id (autoincrement) des Datensatzes verwaltet wird, würde das auch bedeuten, das alle Clients alle Daten neu laden müßten.
    Eine andere Idee?
     
  4. akretschmer

    akretschmer Datenbank-Guru


    Klar, aber in PostgreSQL, da kenn ich mich besser aus ;-)


    Code:
    test=# select * from a;
     i
    ---
     1
     3
     5
     7
    (4 rows)
    
    test=*# select * from b;
     i
    ---
     1
     2
     3
     4
     5
    (5 rows)
    
    test=*#
    with
      x as (insert into a select i from b except select i from a returning 'insert'::text, *),
      y as (delete from a where i in (select i from a except select i from b) returning 'delete'::text, *)
    select * from x union select * from y;
      text  | i
    --------+---
     insert | 2
     insert | 4
     delete | 7
    (3 rows)
    
    Test:

    Code:
    test=*# select * from a;
     i
    ---
     1
     3
     5
     4
     2
    (5 rows)
    
    test=*# select * from b;
     i
    ---
     1
     2
     3
     4
     5
    (5 rows)
    
    Das nennt sich 'writeable CTE', wird MySQL so nicht können. IIRC kann es auch kein except. Sorry, aber Du hattest gefragt ;-)
    Das geile daran ist, daß das ein EINZIGER Befehl ist und atomar ausgeführt wird.


    Andreas
     
  5. akretschmer

    akretschmer Datenbank-Guru


    Hasts nu hinbekommen?

    Code:
    mysql> select * from a;
    +------+               
    | i    |               
    +------+               
    |    1 |               
    |    3 |               
    |    5 |
    |    7 |
    +------+
    4 rows in set (0.00 sec)
    
    mysql> select * from b;
    +------+
    | i    |
    +------+
    |    1 |
    |    2 |
    |    3 |
    |    4 |
    |    5 |
    +------+
    5 rows in set (0.00 sec)
    
    mysql> insert into a select i from b where i not in (select i from a);
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> delete from a where i not in (select i from b);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from a;
    +------+
    | i    |
    +------+
    |    1 |
    |    3 |
    |    5 |
    |    2 |
    |    4 |
    +------+
    5 rows in set (0.00 sec)
    
    mysql>
    
    
    Andreas
     
  6. tibi38

    tibi38 Benutzer

    Hallo Andreas,
    jaj es läuft nun.
    Nur beim Insert schreibe ich einfach alle rein aus B und nutze das Mysql-Spezial 'On update' um Fehlermeldungen bei Doppelte zu verhindern.
    Gruß
    TiBi
     
Die Seite wird geladen...
Ähnliche Themen - Datenabgleich
  1. donaldax
    Antworten:
    6
    Aufrufe:
    2.041

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden