2010-11-29 5 views
0

다음과 같이 정의 된 두 개의 테이블이 있습니다. RELHOSPOL에서 DELETE 명령을 실행하여 SQL Manager에서 행을 삭제하면 USER 테이블에서 필요한 행이 널 (NULL)로됩니다. 아래에 설명 된 메소드로 응용 프로그램에서 행을 삭제할 때마다 RELHOSPOL에서 행을 삭제하고 USER 테이블에서 필요한 행을 설정하지 않습니다. 누락 된 점은 무엇입니까?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해야합니다. 연결 별 구성 옵션입니다. 일단 이것을 작성하면 수행 한 첫 번째 작업 중 하나로 추가하십시오.

PRAGMA foreign_keys = on;