H2 SQL in SQLITE

ColaFantaBier

Neuer Benutzer
Beiträge
4
Hi Leute,

ich habe ein Datenbankmodell von einer H2 Datenbank (JDBC) als Script und will dieses in eine SQLITE Syntax manuell umkonvertieren, da ich leider kein gutes TOOL für diese Aufgabe gefunden habe.

Insgesamt sind es 55 Tabellen mit ein paar INSERTS.
Viele Sachen haben beim manuellen Konvertieren geklappt, doch ich habe Probleme bei folgender H2 SQL Tabellen-Problemeatik in SQLITE.

Syntax von H2SQL:
-------------------------------------------
CREATE TABLE Tabelle1(
ID INT NOT NULL AUTO_INCREMENT,
`FIELD1_ID` INT NULL,
`FIELD2` VARCHAR(100) NULL,
`FIELD3` INT NOT NULL
`FIELD4` VARCHAR(100) NOT NULL,
PRIMARY KEY (`ID`),
CONSTRAINT BIERBRAU_BLABLA FOREIGN KEY(FIELD1_ID) REFERENCES FIELD1(ID) ON DELETE SET NULL NOCHECK
);
-------------------------------------------

Ich benutzte DB Browser und dort kann man bei " Tabelle erstellen" nur DEFAULT, UNIQUE oder NOT NULL wählen.
In Tabelle erstellen kann man Felder hinzufuegen.

Wenn ich aber selber eine SQL Query erstelle, dann kann ich hinter INTEGER auch die Null einfuegen und der SQL- Code wird ohne Fehler ausgeführt.
Wenn ich mir dann aber die Tabelle wieder angucke , dann ist die NULL weg hinter dem INTEGER bei FIELD1.

Normalerweise dürfte `FIELD1_ID` INT NULL ein Nullable -Wert sein, was also heisst, dass es entweder eine Ganzzahl sein kann, oder NULL.

Ein weiteres Problem habe ich mit NOCHECK hinter der Fremdschlüssel-Klausel "ON DELETE SET NULL".
Anscheinend muss man bei SQLITE für NOCHECK ein PRAGMA benutzen. Aber so ganz verstehe ich das nicht.

PRAGMA schema.foreign_key_check(`TABLE`);
-- Disable checks:
PRAGMA foreign_keys = OFF;
-- Enable checks:
PRAGMA foreign_keys = ON;

Ich habe hier mal meinen umgeschriebenen Code in SQLite hier.
Aber ich weiss nicht genau, wie ich das in meinen Code einfuegen kann.

SQL Syntax:
-------------------------------------------
PRAGMA foreign_keys = ON;
PRAGMA schema.foreign_key_check(`Tabelle1`);
CREATE TABLE `Tabelle1` (
`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`FIELD1_ID` INTEGER NULL,
`FIELD2` TEXT NULL,
`FIELD3` INTEGER NOT NULL
`FIELD4` TEXT NOT NULL,
CONSTRAINT `BIERBRAU_BLABLA ` FOREIGN KEY(`FIELD1_ID`) REFERENCES `FIELD1`(`ID`) ON DELETE SET NULL ,
);
-------------------------------------------

Ich hoffe mir kann jemand weiter helfen.
Beste Grüße
 
Werbung:
Du mußt nicht expliziet sagen, daß eine Spalte NULL-able ist - das ist sie per Default.

Und das NOCHECK erscheint mir auch hyperfluid:

Code:
test=*# create table m(id int primary key);
CREATE TABLE
test=*# create table s(m_id int references m on delete set null);
CREATE TABLE
test=*# rollback;
ROLLBACK
test=# create table m(id int primary key);
CREATE TABLE
test=*# create table s(m_id int references m on delete set null nocheck);
FEHLER:  Syntaxfehler bei »nocheck«
ZEILE 1: ...e table s(m_id int references m on delete set null nocheck);
                                                               ^
test=*#

PostgreSQL ...
 
Vielen Dank für die Antwort.

Ok, das mit dem NULL-able macht Sinn.
Verstehe nur nicht ganz, warum bei 9 von 55 Tabellen dann extra die NULL-able nach dem Datentyp geschrieben wurde und bei den anderen nicht, wenn es schon per Default so vorgegeben ist.

Hm,was meinst du genau mit Hyperfluid?

In deiner Syntax verwendest du Postre- SQL.
Postre-SQL-Syntax ist aber nicht gleich SQLite.
In T-SQL muss zum Beispiel NOCHECK direkt vor CONSTRAINT stehen und nicht nach der Fremdschlüssel-Klausel.
Wie kann ich das NOCHECK nun bei SQLite einfuegen?

Gruß
 
Zuletzt bearbeitet:
Werbung:
Hyperfluid: flüssiger als Wasser, überflüssig

Ja, ich verwende PostgreSQL, dessen Syntax sehr 'nah' an den SQL-Spezifikationen sind. Details anderer Datenbanken kenne ich nicht wirklich.
 
Zurück
Oben