SQLite Daten aus SQLite DB in andere SQLite DB importieren

godi

Aktives Mitglied
Hallo,

ich möchte bestimmte Werte aus einer bestehenden (fremden) SQLite Datenbank in eine andere (meine) Importieren.
Dazu habe ich das Schema von meiner DB im Temp-Bereich nochmals erstellt die fremde DB an meine angehängt
und die Werte von der fremden DB aufbereitet so dass sie zu meiner Struktur passen und in die Temp-DB kopiert.

Soweit funktioniert schon mal alles.

Jetzt sollten noch die Primärschlüsseln angepasst werden (damit sie sich nicht mit denen aus meiner DB überschneiden) und danach könnte ich ja die Werte in meine DB kopieren.

Da bin ich mir jetzt nicht sicher wie ich das umsetzen soll.
1) Wenn ich die ID (PrimaryKey) in der TempDB einer Tabelle so erhöhen will das ich keine Überschneidungen mit den ID's in der Ziel Tabelle habe,
dann habe ich bei der Update query das Problem dass ich hier doppelte PrimaryKeys habe.
zB. Eine Tabelle hat 20 Zeilen => ID soll von 1 auf 10 => ID 10 gibt es schon => Error doppelter PrimaryKey!
Der Order by ID asc/desc funktioniert in der Update query irgendwie nicht.
Aber damit sollte es ja möglich sein oder?

2) Habe ich manchmal "Löcher" in den ID's. ZB auf 500 folgt 800 oder nur jede zweite ID (1,3,5,...) da ja nicht alle Daten importiert werden.
Soll ich diese Löcher stopfen oder einfach ignorieren?
In einer Tabelle sind über 2Millionen Zeilen => das würde lange dauern. ;)
Platz in einem Integer sollte ja genügend sein (bei 8 Byte 2^63-1 oder?)
Soviele Daten werden eher nur beim ersten Import übertragen.
Weiters werden dann nur noch neu hinzugekommene Daten übertragen.

3) Ist mein Weg über die Temp-DB überhaupt richtig?
Oder würde es anders einfacher gehen?


godi
 

OlliL

Bekanntes Mitglied
Willst du das ganze rein auf SQL-Ebene lösen? Wolltest du einfach alle Daten so modifizieren, das du mit einem INSERT INTO .... (SELECT * FROM ....); auskommst? Wenn das wirklich nötig ist, schalte alle Foreign Keys der alten Tabellen in deineri Temp-DB ab, und ändere im ersten Rutsch alle Schlüssel auf Werte welche weder in deiner DB noch in der Temp-DB vorkommen, und auch nicht zukünftig vorkommen werden (also z.B. id = id + 1000000). Und danach setzt du dann deine Schlüssel so wie du sie brauchst. Verstehst was ich meine?

Aber...

Schreibe doch ein kleines Programm, mit welchem du dir die zu migrierenden Datensätze liest, und in deine neue Tabelle einfügst mit deinem eigenem Primärschlüssel. Sehe das Problem nicht so ganz?
 

godi

Aktives Mitglied
Hallo,

Willst du das ganze rein auf SQL-Ebene lösen? Wolltest du einfach alle Daten so modifizieren, das du mit einem INSERT INTO .... (SELECT * FROM ....); auskommst?

Ja genau so habe ich es mir vorgestellt.
Ich denke das ist das schnellste oder?

Wenn das wirklich nötig ist, schalte alle Foreign Keys der alten Tabellen in deineri Temp-DB ab, und ändere im ersten Rutsch alle Schlüssel auf Werte welche weder in deiner DB noch in der Temp-DB vorkommen, und auch nicht zukünftig vorkommen werden (also z.B. id = id + 1000000). Und danach setzt du dann deine Schlüssel so wie du sie brauchst. Verstehst was ich meine?

Ja verstehe was du meinst.
Jedoch wenn ich die Foreign Keys abschalte dann gehen ja meine ganzen Referenzen verloren...

Ich habe mir das mal so vorgestellt:
SQL:
UPDATE Exercises SET ExerciseID = ExerciseID + (
SELECT case when max(m.rowid) isnull then 0 else
case when max(t.rowID) - min(t.rowID) < min(t.rowID)  - max(m.rowID) then max(m.rowID)-min(t.rowID) else
case when max(m.rowID) > max(t.rowID) then max(m.rowID) else max(t.rowID) end -min(t.rowID) +1
end end as offset from main.exercises m, temp.exercises t);
Da habe ich nur einen Update Aufruf pro Tabelle und im schlechtesten Fall ist in der Zieltabelle nur eine Lücke von dem Abstand zwischen kleinster id und größter id -1 (id von der Temp Tabelle).

Jedoch ist bei Anwendung auf meine Testdatenbank (mit ca 20.000 Zeilen in der größten Tabelle) dies doch sehr langsam. t > 60s.

Aber...

Schreibe doch ein kleines Programm, mit welchem du dir die zu migrierenden Datensätze liest, und in deine neue Tabelle einfügst mit deinem eigenem Primärschlüssel. Sehe das Problem nicht so ganz?

Ich denke das dies noch langsamer werden wird wenn da Millionen von Objekten erzeugt werden müssen.

godi
 

OlliL

Bekanntes Mitglied
Reden wir von einer permanenten Migration oder einer einmaligen Geschichte?
Sind Alt- und Neu-Applikation zu dem Zeitpunkt offline oder läuft irgendwas von beidem parallel noch und man kann keinen gesicherten Zustand annehmen?
Hast du die Foreign-Keys mit Cascade, so das du durch das Update auf Tabelle A, den neuen Key in alle weiteren Tabellen automatisch durchziehst?

Wenn einmalig: Warum ist Zeit so extrem wichtig?
Wenn beides offline: Einmalig die maximale ID ermitteln und diese als Konstante verwenden - erleichtert das UPDATE ungemein. Generell sollte (wenn Zeit so relevant ist) ein update mit der Konstante und abgeschalteten Keys auf alle Tabellen wesentlich schneller sein als ein einzelnes Update auf die Haupttabelle und durchziehen der ID via Foreign Keys. Ich kenne die Interna von SQLite nicht, aber viele RDBMS arbeiten grundsaetzlich erstmal ohne Keys schneller (da Keys immer zusaetzliche Ueberpruefungen bedeuten) und gerade im UPDATE ist man mit Stichwort bulking x mal schneller als wenn er für jede Zeile einzeln die entsprechenden referenzierten Zeilen raussucht und diese updated... und das mit jeder Zeile in deiner Haupttabelle... enorm viele Zugriffe.

Überlege was abgeht... du machst ein Update auf eine Zeile in deiner Haupttabelle, er muss nun alle verknüpften Tabellen ermitteln, und in diesen dann die Datensätze selektieren welche den gleichen Fremdschlüsselwert haben. Diese muss er dann geziehlt anpassen.

Losgelöste UPDATE tabelle SET ID = ID + 100000; sind wesentlich fixer.

Danach kannst du ja zur Sicherheit die Keys wieder anschalten um sicher zu gehen das die Daten noch konsistent sind.
 
Zuletzt bearbeitet:

godi

Aktives Mitglied
Reden wir von einer permanenten Migration oder einer einmaligen Geschichte?
Sind Alt- und Neu-Applikation zu dem Zeitpunkt offline oder läuft irgendwas von beidem parallel noch und man kann keinen gesicherten Zustand annehmen?
Hast du die Foreign-Keys mit Cascade, so das du durch das Update auf Tabelle A, den neuen Key in alle weiteren Tabellen automatisch durchziehst?

Wenn einmalig: Warum ist Zeit so extrem wichtig?

Naja Zeit ist nicht so wichtig, es sollte halt keine Stunde dauern. ;)
Beide Datenbanken befinden sich lokal auf dem Rechner also Offline.
Notfalls ist es sicher noch möglich zu überprüfen ob das andere Programm auch ausgeführt wird.
Da aber nicht dauerhaft Daten in die DB geschrieben werden und sowieso selektierte Daten übertragen werden sollen ist es egal ob das andere Programm geöffnet ist und somit ein gesicherter Zustand vorhanden.

Ich habe mir das so vorgestellt, dass der Benutzer aus einer Liste auswählen kann welche Daten übertragen werden sollen. Quasi manuelle Synchronisation. Also würde nur beim ersten mal "Synchronisieren" die große Menge an Daten anfallen. Bei der nächsten Synchronisation wäre das Datenaufkommen schon viel geringer.

Die Foreign-Keys habe ich so erstellt:
SQL:
FremdID INT NOT NULL 		REFERENCES FremdTabelle(FremdID) ON DELETE RESTRICT ON UPDATE CASCADE
und Pragma foreign_keys = on;

Vielen Dank für deine ausführliche Antwort!
Ich bin noch am einarbeiten in DB bzw versuche ich zur Zeit mein erstes "richtiges" Java Programm zu entwickeln. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
thobren Projekt SQlite! Wie kann ich auf auf SQlite Daten zugreifen? Datenbankprogrammierung 4
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
D Alte Daten ins neue Modell quetschen Datenbankprogrammierung 6
R Mongodb Daten werden immer überschrieben Datenbankprogrammierung 7
R Mongodb Daten in einem bestimmten Document speichern Datenbankprogrammierung 1
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
B Daten HSQL-DB Datenbankprogrammierung 2
V H2 ManyToMany wie speichere ich die Daten? Datenbankprogrammierung 10
OnDemand Daten verschlüsseln Datenbankprogrammierung 42
L Oracle Daten in Häppchen selektieren Datenbankprogrammierung 5
L Oracle Daten von Oracle zu MSSQL übertragen Datenbankprogrammierung 4
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Z Ausgabe nur bestimmter Daten Datenbankprogrammierung 6
E netbeans - jsp Daten in Datenbank hinzufügen Datenbankprogrammierung 2
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Kirby.exe Vorschläge zur Verschlüsselung von Daten in der DB Datenbankprogrammierung 2
T Java Spiel Daten speichern Datenbankprogrammierung 1
LimDul H2 Embedded DB und Gigabytes an Daten Datenbankprogrammierung 0
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
R Wie mit zu viele Daten umgehen? Datenbankprogrammierung 2
F MySQL Wie speichere ich Daten zeitlich abhängig? Datenbankprogrammierung 4
T Oracle Normalisierung und Daten splitten Datenbankprogrammierung 1
JG12111989 DB-Daten werden falsch dargestellt Datenbankprogrammierung 7
K H2 Daten in die H2 console DB eintragen Datenbankprogrammierung 2
L SQLite Ändern der Daten in einem UNIQUE Feld Datenbankprogrammierung 1
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
L Oracle Daten von einem Server zum andere kopieren Datenbankprogrammierung 24
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
L MySQL Vergleichen von Array-Inhalt, Ausgabe gleicher Daten Datenbankprogrammierung 3
W Daten in Java intern abfragen Datenbankprogrammierung 1
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
I MySQL Datenbankstruktur angleichen - Daten behalten Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
P LDAP: Daten eintragen funktioniert nicht Datenbankprogrammierung 7
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
O mit Multi-Thread Daten aus Datenbank lesen und schreiben Datenbankprogrammierung 22
F Daten verdichten Datenbankprogrammierung 0
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
B Daten aus DB in Word Dokument Datenbankprogrammierung 2
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
D Daten posten auf RestApi (Mongodb/NoSQL) Datenbankprogrammierung 0
I Fehler bei Ausgabe der Daten aus der DB Datenbankprogrammierung 3
OnDemand MySQL Daten aktualisieren Datenbankprogrammierung 6
D Daten von einem Server in eigenem Java-Programm benutzen Datenbankprogrammierung 6
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
S Daten aus Form in Datenbank nur einmal eintragen Datenbankprogrammierung 2
6 JBDC Daten verschlüsseln? Datenbankprogrammierung 2
F MySQL Daten ändern über Java Datenbankprogrammierung 3
H Grosse Menge an Daten in eine Datenbank Datenbankprogrammierung 32
M Daten nachträglich hinzufügen Datenbankprogrammierung 6
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
N HSQLDB Daten Auslesen Datenbankprogrammierung 3
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
P MySql daten in leeren jtable übertragen Datenbankprogrammierung 5
SexyPenny90 SQL Daten sortieren und top 5 ausgeben Datenbankprogrammierung 7
L Hibernat will Daten nicht einfügen??? Datenbankprogrammierung 2
B MySQL DB Daten aktualisieren Datenbankprogrammierung 9
D MySQL Daten werden aus Datenbank gelesen, obwohl sie dort gar nicht angekommen sind Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D Übersichtliche Zuweisung von Daten in Tabellen Datenbankprogrammierung 17
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
J Daten synchronisieren in Multi-Client-Anwendungen (Hibernate) Datenbankprogrammierung 6
S JPA: DB Schema ändern und Daten nicht verlieren - wie? Datenbankprogrammierung 5
T MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt? Datenbankprogrammierung 4
F Daten in die DB hinzufügen Datenbankprogrammierung 7
H Klasse welche Mysql Daten zurück gibt Datenbankprogrammierung 18
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
H Daten in/aus Datenbank schreiben Datenbankprogrammierung 2
M DropDownBoxen mit MySQL Daten füllen Datenbankprogrammierung 3
E MySQL Daten in die Datenbank eingeben via Java Programm Datenbankprogrammierung 3
F ORA 17410 Keine weiteren Daten aus Socket zu lesen Datenbankprogrammierung 2
B Daten aus Datenbank holen Datenbankprogrammierung 6
T Problem beim schreiben von daten Datenbankprogrammierung 4
N Daten aus Datenbank abfragen und anzeigen in der Praxis?? Datenbankprogrammierung 2
G MySQL Bekomme keine Daten. Datenbankprogrammierung 7
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
G Daten aggregieren Datenbankprogrammierung 11
Gossi Oracle 2 Daten (Datum) vergleichen Datenbankprogrammierung 6
W MySQL Daten aus bestimmter Spalte lesen Datenbankprogrammierung 2
E MySQL Befüllen einer MySQL DB mit großen Daten Datenbankprogrammierung 6
J Doppelte Daten in Spalte, nur die erste abrufen wie? Datenbankprogrammierung 15
P Daten aus MySql Datenbank lesen??? Datenbankprogrammierung 6
J Daten vergleichen Datenbankprogrammierung 10
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
X Daten einer DatenbankTabelle in JTable darstellen Datenbankprogrammierung 13
T Designfrage: DB-Daten direkt oder verzögert speichern Datenbankprogrammierung 2
Dragonfire Daten aus jsp Datei in datenbank speichern Datenbankprogrammierung 15
A Daten von Webshop einlesen Datenbankprogrammierung 5
S Daten aus jTextfiled in DB schreiben - SQL Befehl Datenbankprogrammierung 2
T Daten aus DB in variable Zahl an Variablen speichern Datenbankprogrammierung 18
A Datenbankanbindung an mySQL und Ein-/Auslesen der Daten Datenbankprogrammierung 4
D Vector mit Daten aus der Datenbank füllen Datenbankprogrammierung 7
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
S Fehler beim Auslesen von Daten Datenbankprogrammierung 6
D Keine Ausgabe der Daten Datenbankprogrammierung 3
G Daten schneller aus einer DB auslesen Datenbankprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben