2010-06-11 3 views
8

Почему следующее ограничение внешнего ключа (хотя выполняется отлично) не выполняется SQLite? Как я могу добиться соблюдения отношений?Внешний ключ не применяется

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY, 
    FirstName TEXT NOT NULL, 
    LastName TEXT NOT NULL, 
    Username TEXT NOT NULL, 
    Password TEXT NOT NULL, 
    Email TEXT NOT NULL, 
    SignupDate TEXT NOT NULL 
) 

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY, 
    UserID TEXT, 
    FOREIGN KEY(UserID) REFERENCES User(UserID) 
) 

ответ

12

Как the relevant docs говорят (в разделе 2. Включение внешних ключей поддержки):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

вы использовали ли, что PRAGMA в соответствующей связи? (Предполагая, как говорят документы, что sqlite скомпилирован надлежащим образом, а также версия с достаточно недавним выпуском, чтобы, конечно, обеспечить принудительное ограничение внешних ключей).

+0

Большое спасибо за быстрый ответ. Я никогда не замечал этого в документации (в следующий раз будет выглядеть сложнее). Просто попробовав запустить эту команду, я получаю следующую ошибку: «Не удалось выполнить SQLite prepare(). ОШИБКА: авторизация отказана. ДЕТАЛИ: не авторизовано. EXPRESSION: PRAGMA foreign_keys = ON; Я предполагаю, что версия, которую они используют, не поддерживает или отключила функциональность. Могу ли я создать тот же конечный результат с помощью триггеров? Если да, то может ли кто-нибудь указать некоторый пример триггерного синтаксиса для SQLITE? –

+0

@Maxim, я считаю, что SQL-ключи с внешним ключом требуют точно такой же базовой функции, как и обычные старые внешние ключи (часто удаляются во встроенных строках sqlite, которые хотят быть маленькими и быстрыми, чем они хотят предлагать «полную реляционную мощность ACID» на значительная производительность и затраты на работу). –

3

Вы также можете включить поддержку внешнего ключа с помощью встраивания в ConnectionString:

foreign keys=True 

Пример:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture"