2010-11-29 14 views
0

Ich habe zwei Tabellen, die wie folgt definiert haben; Wenn ich eine Zeile aus RELHOSPOL aus dem SQL-Manager lösche, indem ich einen DELETE-Befehl ausführe, werden die erforderlichen Zeilen in der USER-Tabelle auf Null gesetzt. Wenn ich eine Zeile aus der Anwendung mit der unten beschriebenen Methode lösche, löscht sie nur die Zeile aus RELHOSPOL und setzt NULL nicht die erforderlichen Zeilen in der Tabelle USER. Was ist der fehlende Punkt?SQLite Fremdschlüssel Probleme

CREATE TABLE [USER] (
    [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [GROUPID] INTEGER CONSTRAINT [FK_USER_GID] REFERENCES [GROUP]([ID]) ON DELETE SET NULL ON UPDATE CASCADE, 
    [HOSPITALID] INTEGER, 
    [POLIKLINIKID] INTEGER, 
    [NAME] VARCHAR(50) NOT NULL, 
    [LOGINID] VARCHAR(15) NOT NULL, 
    [EMAIL] VARCHAR(50) NOT NULL, 
    [PASSWORD] VARCHAR(32) NOT NULL, 
    CONSTRAINT [FK_USER_RELHOSPOL] FOREIGN KEY([HOSPITALID], [POLIKLINIKID]) REFERENCES [RELHOSPOL]([HOSPITALID], [POLIKLINIKID]) ON DELETE SET NULL ON UPDATE CASCADE); 

CREATE UNIQUE INDEX [AS] ON [USER] ([LOGINID]); 
CREATE UNIQUE INDEX [AS1] ON [USER] ([EMAIL])); 

CREATE TABLE [RELHOSPOL] (
    [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [HOSPITALID] INTEGER, 
    [POLIKLINIKID] INTEGER); 

CREATE UNIQUE INDEX [UNIQUE_RELHOSPOL] ON [RELHOSPOL] ([HOSPITALID], [POLIKLINIKID]); 

public void deletePoliklinikFromHospital(int hospitalId, int poliklinikId) throws SQLException{ 

     String query = "DELETE FROM [RELHOSPOL] WHERE (HOSPITALID = ? AND POLIKLINIKID = ?)"; 
     try { 
      PreparedStatement statement = db.prepareStatement(query); 
      statement.setInt(1, hospitalId); 
      statement.setInt(2, poliklinikId); 
      statement.executeUpdate(); 
     } catch (SQLException e) { 
      throw new SQLException(e.getMessage()); 
     } 
    } 

Antwort

0

Sie müssen turn on enforcement of foreign keys, die aus Gründen der Abwärtskompatibilität standardmäßig deaktiviert ist. Es ist eine Konfigurationsoption pro Verbindung. Fügen Sie dies als eines der ersten Dinge, die Sie tun, nachdem Sie eine Connection:

gemacht haben
Verwandte Themen