sqlite中的递归外键

时间:2011-06-29 05:17:59

标签: ios4 sqlite

sqlite中是否允许自引用或递归外键?有没有特殊的语法来实现这一目标?到目前为止,我已尝试以下内容无效:FOREIGN KEY(ParentPrimaryKeyId) REFERENCES ThisTableName(PrimaryKeyId)

作为参考,我的目标是iOS 4中的sqlite 3.6.22。

2 个答案:

答案 0 :(得分:8)

是的,sqlite支持自引用外键,例如:

sqlite> PRAGMA foreign_keys = ON;
sqlite> CREATE TABLE SomeTable (
   ...>     id INTEGER PRIMARY KEY AUTOINCREMENT,
   ...>     parent_id INTEGER, 
   ...>     FOREIGN KEY(parent_id) REFERENCES SomeTable(id));
sqlite> INSERT INTO SomeTable (parent_id) VALUES (234324);
Error: foreign key constraint failed
sqlite> INSERT INTO SomeTable (parent_id) VALUES (NULL);
sqlite> SELECT * FROM SomeTable;
1|
sqlite> INSERT INTO SomeTable (parent_id) VALUES (1);
sqlite> SELECT * FROM SomeTable;
1|
2|1
sqlite> 

答案 1 :(得分:-2)

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。