Как включить удаление каскада внешних ключей по умолчанию в 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 могут измениться, чтобы ограничения внешнего ключа были включены по умолчанию. Осторожные разработчики не будут делать никаких предположений о том, включены ли внешние ключи по умолчанию, но вместо этого будут включать или отключать их по мере необходимости.)