2010-11-28 24 views
2

私は以下のように定義された2つのテーブルを持っています。ユーザーテーブルからhospitalIdとpoliklinikIdの両方がテーブルrelhospolを参照しており、relhospolから行が削除された場合(関連するユーザーがあれば)、hospitalIdとpoliklinikId nullを設定したいとDDLは言います。 SQLite Managerから行を削除すると、ユーザーのhospitalIdとPoliklinikIdはnullになりますが、アプリケーションレベル(Java)から行を削除しようとすると、relhospolから削除され、null(hospitalId、PoliklinikId)は設定されません。失点?
JDBCドライバ:SQLiteの-JDBC-3.7.2削除時に外部キーの問題

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] (
    [HOSPITALID] INTEGER CONSTRAINT [FK_RELHOSPOL_HOS] REFERENCES [HOSPITAL]([ID]) ON DELETE SET NULL ON UPDATE CASCADE, 
    [POLIKLINIKID] INTEGER CONSTRAINT [FK_RELHOSPOL_POL] REFERENCES [POLIKLINIK]([ID]) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT [sqlite_autoindex_RELHOSPOL_1] PRIMARY KEY ([HOSPITALID], [POLIKLINIKID])); 
+0

DDLに問題はありますか? – anarhikos

答えて

0

あなたはNULL主キーを設定することはできません。

CREATE TABLE [RELHOSPOL] (
[HOSPITALID] INTEGER CONSTRAINT [FK_RELHOSPOL_HOS] REFERENCES [HOSPITAL]([ID]) ON DELETE SET NULL ON UPDATE CASCADE, 
[POLIKLINIKID] INTEGER CONSTRAINT [FK_RELHOSPOL_POL] REFERENCES [POLIKLINIK]([ID]) ON DELETE SET NULL ON UPDATE CASCADE, 
CONSTRAINT [sqlite_autoindex_RELHOSPOL_1] PRIMARY KEY ([HOSPITALID], [POLIKLINIKID])); 

あなたはどのテーブルから行を削除しようとしていますか? DELETE SQLを投稿できますか?

0

私は以下のようにRELHOSPOLの定義を変更しました。 DELETEコマンドを実行してSQLマネージャからRELHOSPOLの行を削除すると、USER表の必要な行がNULLになります。 Iは、以下の記述された方法を使用してアプリケーションから行を削除するときはいつでも、それだけでRELHOSPOLから行を削除し、

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

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

メソッドを削除ユーザテーブルにおいてNULL必要な行を設定しない:

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

それあなたはデータベースに接続するたびにPRAGMA foreign_keys = ON;enable foreign key supportを持っていなければならないことに気づいていないかもしれません。これが行われないと、あなたのステートメントは解析されますが、強制されません。これは、なぜそれがSQLiteマネージャーから働いているのかを説明することができます。

古いバージョンのSqlite(< 3.6.19)も構文を許容しますが、何も実行しないことにも注意してください。

傍系: @NeuquinoはON DELETE SET NULLという表をRELHOSPOLと書くと意味がありません。

関連する問題