SQLite поддерживает внешние ключи, в которых ссылочная таблица и ссылочная таблица являются одной и той же таблицей. (См., Например, ответ Sixfeetsix. Целевой столбец ограничения внешнего ключа должен иметь ограничение «первичный ключ» или «уникальный»). Но вам следует задуматься о том, нужно ли вам хранить информацию о вещах и отношения между вещами в одной таблице.
Например, для "родителей" и "детей" что-то в этом роде часто является лучшей идеей.
pragma foreign_keys = on;
create table persons (
person_id integer primary key,
person_name varchar(15) not null
);
insert into persons values (1, 'Dad');
insert into persons values (2, 'One son');
insert into persons values (3, 'One daughter');
create table persons_children (
parent_id integer references persons (person_id),
child_id integer references persons (person_id),
check (parent_id <> child_id),
primary key (parent_id, child_id)
);
insert into persons_children values (1,2);
insert into persons_children values (1,3);
Информация о лицах в одной таблице; информация об их отношениях в другом. Затем получите имена по
select pc.parent_id, p1.person_name as parent_name,
pc.child_id, p2.person_name as child_name
from persons_children pc
inner join persons p1 on (p1.person_id = pc.parent_id)
inner join persons p2 on (p2.person_id = pc.child_id);
1 Dad 2 One son
1 Dad 3 One daughter
SQLite не поддерживает рекурсивные запросы в том смысле, как, скажем, PostgreSQL.