Внешний ключ sqlite3

У меня есть база данных, созданная в sqlite3, и я установил внешние ключи на таблице ссуд для таблицы студентов и таблицы книг, чтобы остановить дублирование ссуд:

используя создать таблицу:

CREATE TABLE loan(
  SudentID INTEGER,
  ISBN INTEGER,
  out INTEGER,
  FOREIGN KEY(SudentID)
      REFERENCES student(SudentID)
      ON DELETE CASCADE
  FOREIGN KEY(ISBN)
      REFERENCES book(ISBN)
      ON DELETE CASCADE
)

CREATE TABLE student(
  SudentID INTEGER PRIMARY KEY,
  First TEXT,
  Last,
  Contact Text,
  Year INTEGER)

CREATE TABLE book(
  ISBN INTEGER PRIMARY KEY,
  Title TEXT,
  Price INTEGER,
  Qty INTEGER,
  Subject TEXT)

Если я пытаюсь вставить дубликаты записей в таблицу ссуд, внешний ключ не мешает этому.

Pragma включена как в коде, так и в настройках базы данных Firefox.

Версия 2.6.0

Моя работа заключается в том, чтобы использовать Distinct для фильтрации дубликатов, но есть ли способ активировать их, когда я использую эту базу данных в качестве учебного пособия. Тем не менее cascade delete не работает! Зачем?

2 ответа

Решение

Вы хотите составной первичный ключ на таблице ссуды.

CREATE TABLE loan(
  StudentID INTEGER,
  ISBN INTEGER,
  out INTEGER,
  FOREIGN KEY(SudentID)
      REFERENCES student(SudentID)
      ON DELETE CASCADE
  FOREIGN KEY(ISBN)
      REFERENCES book(ISBN)
      ON DELETE CASCADE
  PRIMARY KEY(StudentID, ISBN)
)

Поддержка внешнего ключа доступна только в версии Sqlite 3.6.19 и выше. Таким образом, проблема может быть одной из следующих:

  1. Версия Sqlite < 3.6.19. Чтобы ваша версия поддерживала внешний ключ или нет, попробуйте следующее:

sqlite> PRAGMA foreign_keys;

Если данные не возвращаются, в отличие от 0 или 1, то ваша версия не поддерживает внешние ключи.

  1. Ваша версия sqlite3 была скомпилирована с одним из этих

SQLITE_OMIT_FOREIGN_KEY

SQLITE_OMIT_TRIGGER

Одна вещь, внешние ключи не применяются в sqlite3. Найти всю эту информацию здесь

Другие вопросы по тегам