Datenabgleich

tibi38

Benutzer
Beiträge
5
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.612
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

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

Andreas
 

tibi38

Benutzer
Beiträge
5
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?
 

akretschmer

Datenbank-Guru
Beiträge
9.612
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?


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
 

akretschmer

Datenbank-Guru
Beiträge
9.612
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


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
 
Werbung:

tibi38

Benutzer
Beiträge
5
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
 
Oben