2010-06-11 17 views
8

Warum wird die folgende Fremdschlüsseleinschränkung (obwohl sie ordnungsgemäß ausgeführt wird) von SQLite nicht erzwungen? Wie kann ich die Beziehung verstärken?Fremdschlüssel wird nicht erzwungen

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY, 
    FirstName TEXT NOT NULL, 
    LastName TEXT NOT NULL, 
    Username TEXT NOT NULL, 
    Password TEXT NOT NULL, 
    Email TEXT NOT NULL, 
    SignupDate TEXT NOT NULL 
) 

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY, 
    UserID TEXT, 
    FOREIGN KEY(UserID) REFERENCES User(UserID) 
) 

Antwort

12

Wie the relevant docs sagen (in Abschnitt 2. Fremdschlüsselunterstützung Aktivieren):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

Haben Sie verwendet, dass PRAGMA in der betreffenden Verbindung? (Nehmen wir an, dass, wie die Dokumentation sagt, sqlite in geeigneter Weise kompiliert wird, und natürlich auch eine Version, die in letzter Zeit ausreicht, um die Durchsetzung von Fremdschlüsselbeschränkungen zu ermöglichen).

+0

Vielen Dank für die prompte Antwort so viel. Das habe ich in der Dokumentation nie bemerkt (wird nächstes Mal härter aussehen). Nachdem ich gerade versucht habe, diesen Befehl auszuführen, erhalte ich den folgenden Fehler: "SQLite prepare() ist fehlgeschlagen. FEHLER: Berechtigung verweigert. DETAILS: nicht autorisiert. EXPRESSION: PRAGMA foreign_keys = ON;" Ich nehme an, entweder die Version, die sie verwenden, unterstützt es nicht oder hat die Funktionalität deaktiviert. Kann ich das gleiche Endergebnis mithilfe von Triggern erstellen? Wenn ja, könnte jemand bitte eine Beispiel-Triggersyntax für SQLITE angeben? –

+0

@Maxim, ich glaube, SQLIlite Fremdschlüsselauslöser erfordern genau die gleiche zugrunde liegende Funktionalität wie normale alte Fremdschlüssel (oft in eingebetteten Builds von SQLite entfernt, die kleiner und schneller sein wollen, als sie "volle relationale ACID-Leistung" anbieten wollen) erhebliche Leistungs- und Platzkosten). –

3

Sie auch auf Fremdschlüsselunterstützung über die Einbettung in Connectionstring drehen kann:

foreign keys=True 

Beispiel:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture" 
Verwandte Themen