Проблемы с внешними ключами при удалении - PullRequest
2 голосов
/ 28 ноября 2010

У меня есть две таблицы, которые определены ниже; Из таблицы user, hospitalId и poliklinikId обе ссылаются на таблицу relhospol, и если какая-либо строка удаляется из relhospol (если с этим связан какой-либо пользователь), я хочу установить значения hospitalId и poliklinikId null, DDL говорит об этом. Когда я удаляю строку из SQLite Manager, он обнуляет пользовательские значения HospitalId и PoliklinikId. Однако, когда я пытаюсь удалить строку из уровня приложения (Java), он удаляет только из relhospol, он не устанавливает нуль (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]));

Ответы [ 3 ]

0 голосов
/ 29 ноября 2010

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

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

Следует также помнить, что старые версии Sqlite (<3.6.19) будут терпеть синтаксис, но также не будут применять что-либо. </p>

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

0 голосов
/ 29 ноября 2010

Нельзя установить 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]));

Вы пытаетесь удалить строку из какой таблицы?Можете ли вы опубликовать УДАЛИТЬ SQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...