Migration MySQL nach Frebird
Hier eine Gegenüberstellung von Lösungen in MySQL und Firebird.
- Verbindungen aufbauen (=Connect)
- AutoInc Felder in Firebird (=Generatoren und Trigger)
- limit x, y in Firebird (Beschränkung der Anzahl der Rückgaben)
- LIST TABLES (Auflistung der Tabellen einer DB)

- Anzahl der Rückgabe-Records (recordcount)
Einige der Informationen stammen aus
FAQ for Firebird Users Migrating From MySQL und wurden hier nur übersetzt und an loklae Gegebenheiten angepasst.
Verbindungen aufbauen (=Connect)
Während bei MySQL, ähnlich wie bei Oracle und DB/2 der Server alle Datenbanken kennt, ist dies beim Firebird-Server nicht so.
Bis zur Version 1.5 muß man beim Verbindungsaufbau dementsprechend direkt auf die Datei verweisen.
Ab der Version 1.5 sind serverseitige Aliasse vorgesehen.
MySQL:
SERVER_HOST=data1.rrze.uni-erlangen.de DATABASE_NAME=testdb USERNAME=username PASSWORD=*****
Firebird:
DATABASE_PATH=data1.rrze.uni-erlangen.de:/data/dbfiles/test.gdb USERNAME=username PASSWORD=***** ROLE=*****
Im Gegensatz zu MySQL speichert der Firebird-Server alle Datenbank-Objekte (Tabellen, Idizes, Views...) in einer Datei. Die Endung ist standardmäßig .gdb.
AutoInc Felder in Firebird (=Generatoren und Trigger)
Die häufigste Frage bei der Migration nach Firebird ist die nach der eindeutigen Transaktions-unabhängigen Nummerierung von Datensätzen.
Dafür stellt der Firebird-Server (wie auch Oracle) Generatoren zur Verfügung.
Hier ein vergleichendes Beispiel für eindeutige Primärschlüssel:
MySQL:
CREATE TABLE test ( field1 integer not null auto_increment, field2 char(10), PRIMARY KEY (field1) );
Datensatz einfügen:
INSERT INTO test (field2) VALUES ('testme');
Firebird:
CREATE TABLE test ( field1 integer not null, field2 char(10), PRIMARY KEY (field1) ); CREATE GENERATOR gen_test_id;
Datensatz einfügen:
INSERT INTO test (field1, field2) VALUES (gen_id(gen_test_id, 1), 'testme');
Das ist auf den ersten Blick etwas aufwendiger, als bei MySQL. Allerdings ist der Vorteil die Flexibilität.
Mit ...
SELECT gen_id(gen_test_id, 0) FROM ...
... kann man jederzeit den Wert eines Genwerators abfragen, ohne diesen zu verändern
und man kann den wert eines Generators jederzeit setzen mit:
SET GENERATOR gen_test_id TO [bel. integer Wert];
Um die Arbeit mit Generatoren zu vereinfachen, empfielt es sich,
einen Trigger zu implementieren, das den Generatorwert automatisch
setzt, wenn er noch nicht gesetzt ist (=NULL):
CREATE TRIGGER test_bi FOR test ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.field1 IS NULL) THEN NEW.field1 = GEN_ID(gen_test_id,1); END
Durch die Abfrage, ob der Wert schon gesetzt ist, gibt es keinen
Konflikt mit der Einfügen-Routine von oben. Damit wird die Syntax des INSERT-Ausdrucks von MySQL auch auf dem Firebird-Server verwendbar.
Mehr zu Generatoren im InterBase Data Definition Guide.
limit x, y in Firebird (Beschränkung der Anzahl der Rückgaben)
Ab Firebird 1.0 gibt es zur Einschränkung der zurückgelieferten Datensätze die FIRST X SKIP Y-Erweiterung des SELECT-Befehls.
Firebird:
SELECT FIRST x SKIP y FROM ... [weitere Query-Optionen]
Die Rückgabe besteht aus (maximal) x Datensätzen, wobei die ersten y übersprungen werden. Wenn X oder Y 0 sein sollen, kann das Schlüsselwort auch weggelassen werden.
LIST TABLES (Auflistung der Tabellen einer DB)
In MySQL kann man sich mit SHOW TABLES alle Tabellen in einer datenbank anzeigen lassen. Diese Funktion existiert in der Kommandozeilen-Version isql des Firebird-Servers ebenfalls.
Allgemeiner erhält man durch Nachschlagen in den System-Tabellen eine Liste aller Tabellen:
Firebird:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;
Die Rückgabe besteht aus allen Tabellen inkl. Views und system-Tabellen
Firebird:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0;
... schränkt die Rückgabe auf Benutzer-Tabellen und Views ein.
Firebird:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEV_BLR IS NULL;
... schränkt die Rückgabe auf Benutzer-Tabellen ohne Views ein.
Eine Ausgabe der System-Tabellen ohne Views bleibt dem Leser als übung offen
Anzahl der Rückgabe-Records (recordcount)
MySQL zählt die Anzahl der zurückgelieferten Datensätze
standardmäßig. Diese Funktion bietet der Firebird-Server nicht.
Stattdessen kann man die Anzahl der Datensätze durch ein SELECT COUNT(*)... SQL-Statement bestimmen.
Aber Achtung: SELECT COUNT(*)... ist eine "teuere" Operation. Ist die Anzahl wirklich nötig?



