2010-11-29 29 views
0

私は以下のように定義した2つのテーブルを持っています。 DELETEコマンドを実行してSQLマネージャからRELHOSPOLの行を削除すると、USER表の必要な行がNULLになります。下記のメソッドでアプリケーションから行を削除すると、RELHOSPOLから行が削除され、USER表で必要な行がNULLに設定されません。欠けている点は何ですか?SQLite外部キーの問題

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()); 
     } 
    } 

答えて

0

あなたは、下位互換性の理由から、デフォルトでオフになっている、turn on enforcement of foreign keysする必要があります。接続ごとの設定オプションです。これを初めて作成したときの最初のものの1つとして追加してください。

PRAGMA foreign_keys = on;