Как включить удаление каскада внешних ключей по умолчанию в SQLite?

SQLite v3.7.5

есть ли способ включить Внешние Ключи SQLite С cascade delete включен по умолчанию? Приведем следующий пример:

CREATE TABLE [Parent] (
[ParentId] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
[Name] VARCHAR(50)  UNIQUE NOT NULL
);

CREATE TABLE [Child] (
[ChildId] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[ParentId] INTEGER  NOT NULL,
[Name] VARCHAR(50)  NOT NULL,
FOREIGN KEY(ChildId) REFERENCES Child(ParentId) ON DELETE CASCADE
);

единственный способ, которым я смог включить каскадное удаление, - это выполнить PRAGMA foreign_keys = true команда перед транзакцией:

using( var conn = new SQLiteConnection( _conn ) )
{
    conn.Open();
    var pragma = new SQLiteCommand( "PRAGMA foreign_keys = true;", conn );
    pragma.ExecuteNonQuery();

    var cmd = new SQLiteCommand( "Delete from Parent where ParentId = 1", conn );
    cmd.ExecuteNonQuery();
}

есть ли параметр на уровне базы данных, который можно настроить, а не вызывать команду pragma перед каждой транзакцией?

Я видел триггеры для включения каскадных удалений, но я ищу что-то, что просто включит PRAGMA foreign_keys = true на уровне базы данных.

3 ответов


нет, даже с параметрами времени компиляции.

единственный способ, до сих пор, использовать pragma foreign_keys=on во время выполнения. Особая опасность заключается в том, что приложение, которое касается базы данных, должно это сделать.

если конкретное приложение не запускает этот оператор pragma, оно может вставлять данные, которые нарушат ограничения внешнего ключа, а другие приложения не будут знать об этом. То есть включение внешних ключей не предупреждает Вас о существующих данных, которые нарушают ограничение.


нет, в настоящее время нет способа (для обратной совместимости). См. ссылку, которую вы предоставили в разделе (2):

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

однако это может быть изменено в будущем:

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