2011-01-06 23 views
4

Ich brauche Fremdschlüssel bei meinem Programm, aber ich weiß nicht, wie man diesen PRAGMA mit C-Sprache aktiviert. (Ich möchte CASCADE-Modi verwenden.)Wie aktiviere ich Fremdschlüssel in C mit sqlite?

Mit sqlite binary schreibe ich einfach PRAGMA foreign_keys = on; und es funktioniert.

Meine Frage ist: Wie kann ich das in C tun?

Antwort

5

zum Teil die SQLLite Handbuch sagt:

Um Fremdschlüssel-Constraints in SQLite zu verwenden, muss die Bibliothek mit keinem der beiden SQLITE_OMIT_FOREIGN_KEY oder SQLITE_OMIT_TRIGGER definiert kompiliert werden. Wenn SQLITE_OMIT_TRIGGER definiert ist, SQLITE_OMIT_FOREIGN_KEY jedoch nicht, verhält sich SQLite wie vor Version 3.6.19 - Fremdschlüsseldefinitionen werden analysiert und können mit PRAGMA foreign_key_list abgefragt werden, aber Fremdschlüsseleinschränkungen werden nicht erzwungen. Der Befehl PRAGMA foreign_keys ist in dieser Konfiguration ein No-Op. Wenn OMIT_FOREIGN_KEY definiert ist, können Fremdschlüsseldefinitionen nicht einmal analysiert werden (der Versuch, eine Fremdschlüsseldefinition anzugeben, ist ein Syntaxfehler).

Unter der Annahme, dass die Bibliothek mit aktivierten Fremdschlüsseleinschränkungen kompiliert wurde, muss sie von der Anwendung zur Laufzeit mithilfe des Befehls PRAGMA foreign_keys weiterhin aktiviert werden. Zum Beispiel:

sqlite> PRAGMA foreign_keys = ON; 

Fremdschlüssel-Constraints werden standardmäßig (für Rückwärtskompatibilität) deaktiviert, so muss für jede Datenbankverbindung separat aktiviert werden. (Beachten Sie jedoch, dass sich zukünftige Versionen von SQLite ändern können, sodass Fremdschlüsseleinschränkungen standardmäßig aktiviert sind. Vorsichtige Entwickler machen keine Annahmen darüber, ob Fremdschlüssel standardmäßig aktiviert sind oder nicht, und aktivieren oder deaktivieren sie bei Bedarf.) Anwendung kann auch eine PRAGMA foreign_keys-Anweisung verwenden, um festzustellen, ob Fremdschlüssel derzeit aktiviert sind.

Und die Seite über pragmas sagt:

  • Spezifische Pragma-Anweisungen entfernt werden und andere hinzugefügt in zukünftigen Versionen von SQLite. Es gibt keine Garantie für die Rückwärtskompatibilität.
  • Wenn ein unbekanntes Pragma ausgegeben wird, werden keine Fehlermeldungen generiert. Unbekannte Pragmas werden einfach ignoriert. Dies bedeutet, dass bei einem Tippfehler in einer Pragma-Anweisung die Bibliothek den Benutzer nicht darüber informiert.
  • Einige Pragmas treten während der SQL-Kompilierungsstufe in Kraft, nicht in der Ausführungsphase. Dies bedeutet, dass bei Verwendung der C-Programmiersprache sqlite3_prepare(), sqlite3_step(), sqlite3_finalize() (oder ähnlich in einer Wrapperschnittstelle) das Pragma während des Aufrufs sqlite3_prepare() und nicht während des Aufrufs sqlite3_step() als normales SQL ausgeführt werden kann Aussagen tun. Oder das Pragma kann während sqlite3_step() wie normale SQL-Anweisungen ausgeführt werden. Ob das Pragma während sqlite3_prepare() oder sqlite3_step() ausgeführt wird oder nicht, hängt vom Pragma und von der spezifischen Version von SQLite ab.

So bereiten Sie die PRAGMA-Anweisung - und führen Sie es sicherzustellen, dass sie wirksam wird.

Möglicherweise gibt es eine spezialisiertere API; Sie können das Handbuch auch lesen.

+0

Danke, aber versucht: sqlite3_prepare (db, "PRAGMA fremder_keys = ON;", -1, & stmt, 0); sqlite3_step (stmt); Der Schritt ergibt SQLITE_DONE, aber es funktioniert noch nicht der Fremdschlüssel. – Fabiano

+0

Haben Sie überprüft, wie Ihre SQLite-Bibliothek erstellt wurde? Beachten Sie die Anforderungen im ersten Zitat - Sie müssen SQLite erstellen, damit Fremdschlüssel aktiviert werden können. –

+0

ES FUNKTIONIERT !! Ich weiß nicht warum, aber ich habe den PC gewechselt, um einen Kompilier-Test zu machen und es funktioniert !! Vielen Dank, Mann! Ich schätze. – Fabiano

2

C ist genau das gleiche - einfach die Anweisung "PRAGMA foreign_keys = ON" ausführen.

+0

OK, aber wie? sqlite3_exec (db, "PRAGMA_fremde_Schlüssel = EIN", NULL, NULL, NULL); Arbeiten Sie nicht – Fabiano

+0

Nun, "nicht arbeiten" könnte viele Dinge bedeuten. Sie sollten nach jedem Aufruf von SQLite-APIs auf Fehler prüfen. Erhalten Sie einen Fehler an irgendeinem Punkt? Wenn nicht, woher weißt du, dass es nicht funktioniert? –

+0

Entschuldigung .. Die Rückkehr ist SQLITE_OK, aber ich sprach das, weil ich den c-Code zusammen mit einem anderen Beispieltest bei sqlite> mache. Also, zuerst führe ich die sql CREATE TABLE bei C-Funktion, dann benutze ich die gleiche sql, um die gleiche Sache zu tun, und dann führe ich andere Abfragen .. Wenn ich versuche, einen Wert bei Fremd-Tabelle (UPDATE), in C-Programm nichts passiert und bei sqlite ändern sich alle Werte am Haupttisch. (Entschuldigung mein Englisch, ich bin Brasilianer) – Fabiano

Verwandte Themen