Как активировать внешние ключи в C, используя sqlite? - PullRequest
4 голосов
/ 06 января 2011

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

С бинарным sqlite я просто пишу PRAGMA foreign_keys = on; и это работает.

Мой вопрос: как я могуэто в C?

Ответы [ 2 ]

5 голосов
/ 06 января 2011

Частично, руководство SQLLite гласит:

Чтобы использовать ограничения внешнего ключа в SQLite, библиотека должна быть скомпилирована без определения SQLITE_OMIT_FOREIGN_KEY или SQLITE_OMIT_TRIGGER.Если SQLITE_OMIT_TRIGGER определен, а SQLITE_OMIT_FOREIGN_KEY - нет, то SQLite ведет себя так же, как и до версии 3.6.19 - определения внешнего ключа анализируются и могут запрашиваться с помощью PRAGMA foreign_key_list, но ограничения внешнего ключа не применяются.Команда PRAGMA foreign_keys не используется в этой конфигурации.Если определено OMIT_FOREIGN_KEY, то определения внешнего ключа невозможно даже проанализировать (попытка указать определение внешнего ключа является синтаксической ошибкой).

Если библиотека скомпилирована с включенными ограничениями внешнего ключа, она все равно должна быть включенаприложение во время выполнения, используя команду PRAGMA foreign_keys.Например:

sqlite> PRAGMA foreign_keys = ON;

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

И на странице о pragmas написано:

  • Отдельные операторы pragma могут быть удалены, а другие добавлены в будущих выпусках SQLite.Нет гарантии обратной совместимости.
  • При выдаче неизвестной прагмы сообщения об ошибках не генерируются.Неизвестные прагмы просто игнорируются.Это означает, что если в операторе pragma есть опечатка, библиотека не информирует пользователя об этом.
  • Некоторые прагмы вступают в силу на этапе компиляции SQL, а не на этапе выполнения.Это означает, что при использовании sqlite3_prepare (), sqlite3_step (), sqlite3_finalize () API на языке C (или аналогичного в интерфейсе оболочки) прагма может выполняться во время вызова sqlite3_prepare (), а не во время вызова sqlite3_step () как обычный SQLзаявления делают.Или прагма может выполняться во время sqlite3_step (), как обычные операторы SQL.Работает ли прагма во время sqlite3_prepare () или sqlite3_step (), зависит от прагмы и от конкретного выпуска SQLite.

Итак, вы готовите оператор PRAGMA и выполняете его, чтобы убедиться, что он вступает в силу.

Возможно, существует более специализированный API;Вы также можете прочитать руководство.

2 голосов
/ 06 января 2011

C точно такой же - просто выполните оператор "PRAGMA foreign_keys = ON".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...