2014-11-26 2 views
1

Я таблицу Rate со следующим structre:JDBC игнорирует SQLite внешнего ключа ON DELETE действия

CREATE TABLE Rate (
id INTEGER PRIMARY KEY AUTOINCREMENT, 
book_id INTEGER, 
value INTEGER, 
user_id INTEGER, 
FOREIGN KEY(user_id) REFERENCES User(ID), 
FOREIGN KEY(book_id) REFERENCES book(ID) ON DELETE RESTRICT 

)

И книгу таблица со следующей структурой:

DROP TABLE IF EXISTS Book; 
CREATE TABLE Book (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT UNIQUE NOT NULL, 
    ISBN VARCHAR, 
    author_id INTEGER, 
    editor_id INTEGER, 
    translator_id INTEGER, 
    publisher_id INTEGER, 
    "type" VARCHAR, 
    language VARCHAR, 
    "date" VARCHAR, 
    format VARCHAR, 
    summary TEXT, 


    FOREIGN KEY(author_id) REFERENCES Author(ID) ON DELETE SET NULL ON UPDATE CASCADE, 
    FOREIGN KEY(editor_id) REFERENCES Editor(ID) ON DELETE SET NULL ON UPDATE CASCADE, 
    FOREIGN KEY(translator_id) REFERENCES Translator(ID) ON DELETE SET NULL ON UPDATE CASCADE, 
    FOREIGN KEY(publisher_id) REFERENCES Publisher(ID) ON DELETE SET NULL ON UPDATE CASCADE 


); 

Итак, если у меня есть такая ставка, как это:

1 1 4 3(ID, BOOK_ID, VALUE, USER_ID) 

Мне не удалось удалить книгу с идентификатором 1, верно? Это именно то, что происходит, когда я пытаюсь удалить книгу с идентификатором 1 в SQLITE Manager. Это дает мне FOREIGN KEY ограничение не удалось

Однако, когда я называю удалить из кода, он полностью игнорирует ограничения и удаляет книгу и нет никаких изменений в записи Оценить еще:

И мой метод удаления подобен следующему:

public void delete() { 
     try { 
      String query = "DELETE FROM book WHERE id = ? "; 
      PreparedStatement statement = db.prepareStatement(query); 
      statement.setInt(1, (Integer) this.id); 
      statement.executeUpdate(); 
      statement.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

Когда я бегу ПРАГМА foreign_keys в SQLITE Manager возвращает 1. Итак, я предполагаю, что база данных создана правильно.

ответ

1

The documentation говорит:

... ограничения внешнего ключа ... еще должны быть разрешены приложением во время выполнения, используя команду PRAGMA foreign_keys. Например:

PRAGMA foreign_keys = ON; 

ключевые Зарубежное ограничения по умолчанию отключены (для обратной совместимости), поэтому должна быть включена отдельно для каждого соединения с базой данных.

+0

Подтверждено. Документация может быть немного яснее, если в ней говорилось, что «ограничения по внешним ключам игнорируются * по умолчанию»: это не мешает нам создавать их, но они не применяются, если мы явно не говорим SQLite об этом. –

+0

Как я могу назвать это на JDBC? Можно предоставить фрагмент кода? – SpiderRico

+2

@SpiderRico Как и любой другой оператор SQL: 'Statement s = conn.createStatement(); s.executeUpdate («PRAGMA foreign_keys = ON;»); ' –

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