Я таблицу 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. Итак, я предполагаю, что база данных создана правильно.
Подтверждено. Документация может быть немного яснее, если в ней говорилось, что «ограничения по внешним ключам игнорируются * по умолчанию»: это не мешает нам создавать их, но они не применяются, если мы явно не говорим SQLite об этом. –
Как я могу назвать это на JDBC? Можно предоставить фрагмент кода? – SpiderRico
@SpiderRico Как и любой другой оператор SQL: 'Statement s = conn.createStatement(); s.executeUpdate («PRAGMA foreign_keys = ON;»); ' –