2010-11-28 2 views
2

У меня есть две таблицы, которые определены ниже; Из таблицы пользователя, hospitalId и poliklinikId оба ссылки table relhospol, и если какая-либо строка удалена из relhospol (если какой-либо пользователь связан с ней), я хочу установить hospitalId и poliklinikId null, DDL говорит об этом. Когда я удаляю строку из SQLite Manager, она сбрасывает больничные данные пользователя и PoliklinikId, однако, когда я пытаюсь удалить строку с уровня приложения (Java), она удаляет только из relhospol, она не устанавливает значение null (hospitalId, PoliklinikId). Что такое отсутствует точка?
JDBC Driver: SQLite-3.7.2 JDBCПроблемы с внешними ключами при удалении

-
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, как показано ниже; Когда я удаляю строку из RELHOSPOL из SQL Manager с выполнением команды DELETE, она нулевает нужные строки в таблице USER. Всякий раз, когда я удалить строку из приложения с методом, написанным ниже, он удаляет только строки из RELHOSPOL, и не SET NULL необходимых строк на таблице USER

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 support с PRAGMA foreign_keys = ON; каждый раз, когда вы подключаетесь к базе данных? Если это не будет сделано, ваши утверждения будут проанализированы, но не будут соблюдены. Это может объяснить, почему он работает с SQLite Manager.

Следует также знать, что старые версии Sqlite (< 3.6.19) будут терпеть синтаксис, но также ничего не будут принуждать.

As sidenote: Как @Neuquino пишет операторы ON DELETE SET NULL для таблицы RELHOSPOL, похоже, не имеет смысла.

Смежные вопросы