Определение внешнего ключа в sqlite

Есть ли способ определить отношения между таблицами и указать между ними внешние ключи при использовании sqlite в Objective c


person Community    schedule 13.07.2009    source источник
comment
см. stackoverflow.com/a/9835781/734687   -  person ChrLipp    schedule 23.03.2012


Ответы (6)


вы можете использовать внешние ключи в sqlite так же, как и в других системах базы данных sql, но имейте в виду, что ограничения внешнего ключа в sqlite не проверяются/применяются!

person codymanix    schedule 13.07.2009

SQLite не является «настоящей» реляционной-базой данных, вы можете иметь поля, которые ссылаются на первичный ключ других таблиц, но вы должны контролировать все из своего кода. То же самое для удаления, без CASCADE или других элементов управления целостностью.

person Clement Herreman    schedule 13.07.2009
comment
Любой пример кода доступен? Я хочу сделать это программно, используя Objective-c - person ; 13.07.2009
comment
Я не знаю Objective-C, только SQLite. У вас есть 1 поле pk_table1 в таблице table1 и 1 поле fk_table1 в таблице table2. Если вы обновите свой fk_table1, в своем коде Objective-C вы проверите, что новое значение существует в pk_table1 и т. д.... Другого способа сделать это не нашел. - person Clement Herreman; 13.07.2009

Вы можете установить один флаг в SQLite для отношения внешнего ключа.

Шаг 1: Перейдите в меню инструментов в SQLiteManager.

Шаг 2: Откройте вкладку SQL при подключении.

Шаг 3: Установите «PRAGMA Foreign_keys=ON;» и сохранить его.

Вы можете использовать базу данных как обычные отношения PK и FK.

Спасибо.

person Community    schedule 29.11.2012

Вы можете легко создать внешний ключ, добавив оператор FOREIGN KEY в команду SQL CREATE.

Например, при наличии лица и адреса объекта:

  • Создайте таблицу пользователей: CREATE TABLE IF NOT EXISTS PERSON (ID INTEGER PRIMARY KEY AUTOINCREMENT, FIRSTNAME TEXT, LASTNAME TEXT)

  • Создайте таблицу адресов: CREATE TABLE IF NOT EXISTS ADDRESS (ID INTEGER PRIMARY KEY AUTOINCREMENT, STREETNAME TEXT, STREETNUMBER INT, PERSONID INT, FOREIGN KEY(PERSONID) REFERENCES PERSON(ID))

Это пометит столбец PERSONID таблицы ADDRESS как внешний ключ, указывающий на столбец ID таблицы PERSON.

Вы также можете найти полное руководство по адресу: http://www.apptite.be/tutorial_ios_sqlite.php

person Luc Wollants    schedule 13.02.2012

вы можете определить отношения внешнего ключа в sqlite, как и в любой другой системе баз данных sql, но для их фактического применения вам нужны дополнительные триггеры. они могут быть скомпилированы автоматически из схемы базы данных с помощью инструмента, поставляемого с официальным дистрибутивом sqlite.

большим преимуществом этого решения является то, что оно не зависит от языка программирования. после настройки вам больше не нужно заботиться о триггерах в исходном коде. см. http://www.sqlite.org/omitted.html для получения дополнительной информации.

person sebasgo    schedule 13.07.2009

Если вы используете структуру Cocoa CoreData и определяете управляемую объектную модель, используя SQLite в качестве постоянного хранилища, вы можете указать отношения между вашей моделью и указать правила удаления (такие как каскад или запрет), и они будут выполняться и проверяться как вы вносите изменения в свои сущности из Objective-C и возвращаете их в базу данных при сохранении.

Отношения и правила очень похожи на правила внешнего ключа базы данных, но выполняются инфраструктурой CoreData внутри среды выполнения Objective-C. База данных SQLite просто используется в качестве хранилища для вашего графа управляемых объектов.

Вот руководство по программированию CoreData на сайте Apple для разработчиков:

NB. Эта структура специфична для Cocoa, и в вашем вопросе явно не упоминается использование Cocoa, а только Objective-C.

person cms    schedule 18.09.2009