Toleranz bei Fremdschlüssel ??

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Toleranz bei Fremdschlüssel ??

Beitrag von Aliobaba »

Hallo,

…. ich bin's schon wieder. Trotz umfangreicher eigener Recherchen muss ich mich hier schon wieder melden.

Mein Problem:
Lazarus kümmert sich nicht um die Vorgaben durch Fremdschlüssel. (Datenbank: SQLite)
In die Tabellen (sh. Tabellenbeispiel im Anhang)
"rFKTx" und "rFKSw" (Fremdschlüssel)
kann ich jeden Integer-Wert eintragen auch wenn der entsprechende Integer-Wert im Primärschlüssel-Feld (rIDSW und rIDText) gar nicht eingegeben und vorhanden ist ????

Der SQLite Manager (Add-on zu Firefox) verhält sich aber korrekt und weist Eingaben in "rFKTx" und "rFKSw" ab, wenn diese Eingaben keinen identischen Gegenpart im entsprechenden Primärschlüsselfeld haben. Lazarus (mit installierter Zeos-Komponente) tut dies – wie gesagt - nicht. In diesem SQLite-Manager habe ich allerdings vor der Erstellung der Datenbank mit den unten angegebenen SQL-Statements diesen Befehl „PRAGMA foreign_keys=ON;“ eingetragen in: „Extras“ -> „Open On-Connect SQL Tab“.

Ein Grund dafür (nur eine Vermutung meinerseits), dass Lazarus so „tolerant“ bei den Foreign-Key's ist, könnte sein, dass man Lazarus auch irgendwo dieses „PRAGMA foreign_keys=ON;“ eingeben muss. Aber wo?

... aber vielleicht gibt's auch ganz andere Gründe für diese "Toleranz" von Lazarus ??

Aliobaba

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Folgende Tabellen habe ich erstellt:  mit SQLite-Manager (PRAGMA foreign_keys = ON);

CREATE TABLE "tCo1"
(
"rIDConn1" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
"rFKTx" INTEGER NOT NULL   ,
"rFKSw" INTEGER NOT NULL   ,
"rC1" VARCHAR,
FOREIGN KEY(rFKTx) REFERENCES  tTX(rIDText) ON DELETE CASCADE,
FOREIGN KEY(rFKSw) REFERENCES  tSW(rIDSW)  ON DELETE CASCADE
)

CREATE TABLE "tSW"
(
"rIDSW" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
"rSwo" VARCHAR,
"rs1" VARCHAR,
"rs2" VARCHAR
)

CREATE TABLE "tTX"
(
"rIDText" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
"rTxt" VARCHAR UNIQUE ,
"rTit" VARCHAR UNIQUE ,
"rHinw" VARCHAR,
"rt1" VARCHAR,
"rt2" VARCHAR,
"rt3" VARCHAR
)
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Toleranz bei Fremdschlüssel ??

Beitrag von Hitman »

http://sqlite.org/foreignkeys.html#fk_enable" onclick="window.open(this.href);return false;

Ich würde also sagen: im AfterOpen Event das entsprechende

Code: Alles auswählen

PRAGMA foreign_keys=ON;
Query absetzen.

Oder du kompilierst dir deine eigene sqlite Library entsprechend: http://sqlite.org/pragma.html#pragma_foreign_keys" onclick="window.open(this.href);return false;

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Toleranz bei Fremdschlüssel ??

Beitrag von Aliobaba »

Danke!! Funktioniert!
(Ich war "knapp dran" an der Lösung; Sorry!!
Mein Gedankenfehler war, dass ich dachte, es würde reichen, bei der allerersten Erstellung der Tabelle diesen Befehl [PRAGMA foreign_keys=ON;]abgesetzt zu haben)
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten