2014-12-15 6 views
0

Итак, сейчас я пытаюсь провести отношения между 3 разными таблицами, используя sqlite Я относительно новичок в sqlite, но увидел, что вы можете рисовать отношения, используя внешние ключи, тем самым оптимизируя производительность. Так что сейчас здесь мой SQL заявление создать мои таблицы:Отношение к одному внешнему ключу Sqlite

'CREATE TABLE IF NOT EXISTS shifts (
shifts_id primary integer, 
shift_base_id integer, 
shift_site_id integer)'; 

'CREATE TABLE IF NOT EXISTS sites (
site_id primary integer, 
site_info text, 
FOREIGN KEY(site_id) REFERENCES shifts(shift_site_id))'; 

'CREATE TABLE IF NOT EXISTS bases (
base_id primary integer, 
base_info text, 
FOREIGN KEY(base_id) REFERENCES shifts(shift_base_id))'; 

Так что я пытаюсь сделать, это сделать отношения между дочерними таблицами (сайтами и базом) с родительской таблицей (сдвиги) по идентификатору. Проблема, с которой я сталкиваюсь, - это ошибка «несоответствия внешнего ключа». Я где-то читал, что в sqlite вы можете использовать только REFERENCE первичный или уникальный ключ в родительской таблице. Проблема заключается в том, что множественные смены могут совместно использовать одни и те же сайты и базы. Например, base_id может равняться 1234, а несколько сдвигов будут иметь shifts_base_id = 1234.

Также будут случаи, когда base_id в таблице оснований не будет иметь сопоставимую shift_base_id в таблице сдвигов.

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

ответ

1

У вас есть свои отношения назад. Вы указываете внешние ключи в таблице, которые ссылаются на другие таблицы.

CREATE TABLE IF NOT EXISTS shifts (
shifts_id primary integer, 
shift_base_id integer, 
shift_site_id integer, 
FOREIGN KEY (shift_base_id) REFERENCES bases (base_id), 
FOREIGN KEY (shift_site_id) REFERENCES site (site_id)); 
+0

Спасибо за помощь @Barmar, это имеет смысл и решило большую часть моей проблемы. Другой - делает возможной связь, если это вообще возможно. Поэтому, если shift_base_id не существует в таблице баз данных, это не сработает. –

+0

@JoeKomputer Просто удалите внешние ключи. Весь смысл FK заключается в обеспечении соблюдения отношений; что делает их «необязательными», будет эквивалентно тому, чтобы их не было вообще. –

+0

@ColonelThirtyTwo Я могу просто удалить внешний ключ, но причина, по которой я создаю эти отношения FK, - ускорить запрос SELECT, когда я иду на запрос базы данных WHERE site_id = shift_site_id. Итак, если бы был способ сделать FK факультативным, это было бы полезно в этом смысле? Или, если есть другой способ повысить производительность между таблицами, которые не связаны с FK, я был бы открыт для предложений. –

Смежные вопросы