2010-11-28 57 views
2

我有兩個表定義如下;從用戶表中,hospitalId和poliklinikId都引用表relhospol,並且如果從relhospol中刪除了任何行(如果有任何用戶與它有關),我想設置hospitalId和poliklinikId爲null,DDL表示。當我從SQLite管理器中刪除一行時,它刪除了用戶的hospitalId和PoliklinikId,但是當我嘗試從應用程序級別(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 2010-11-28 20:01:50

回答

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表中清空必要的行。每當我從應用程序下面所寫的方法刪除一行,它只是刪除行從RELHOSPOL,並沒有設置在用戶表中的NULL必要的行,

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

它只是一個猜測,但也許你沒有意識到,每次連接到數據庫時都必須使用enable foreign key supportPRAGMA foreign_keys = ON;?如果沒有這樣做,你的語句將被解析,但不被強制執行。這可以解釋爲什麼它是從SQLite Manager工作的。

還應該意識到,舊版本的Sqlite(< 3.6.19)將容忍語法,但也不會執行任何操作。

作爲旁註: 由於@Neuquino在表RELHOSPOL中編寫ON DELETE SET NULL聲明似乎沒有道理。