2011-11-03 77 views
13

我读过相当清凉风格BNF语法指定SQLite create table语句SQLite的复合键(2个外键)链接表

这里找到:http://www.sqlite.org/lang_createtable.html

我想知道我是怎么想去创建这些之间的链接表

我有一个表,可以说,房子,和另一个electrical_items。

我想创建一个链接表,以将house_id和item_id作为组合键,但我不确定我会如何去做,它似乎不允许主键是一个外键?

N.B我想要第三个字段pap_tested,它存储了房屋中的电气项目是pap_tested的日期,所以通过复合主键的这个链接表似乎是最好的方法。

回答

27

这些无论是应为你的关联表的工作:

create table house_items (
    house_id integer not null, 
    item_id integer not null, 
    foreign key (house_id) references houses(id), 
    foreign key (item_id) references electrical_items(id), 
    primary key (house_id, item_id) 
) 

create table house_items (
    house_id integer not null references houses(id), 
    item_id integer not null references electrical_items(id), 
    primary key (house_id, item_id) 
) 

你可能想separate (single column) indexes on house_items.house_id and house_items.item_id为好。

+0

有跟着我并不认为链接它适用的house_id是房屋的主键和物品的item_id。 – Luke

1

对于那些需要这种关系的设计,不存在对主键的禁止,也不是一个外键。但是,您的问题不是其中之一,因为链接表中的自然PRIMARY KEY是两列的组合,每个FOREIGN KEY都返回其他表中的一个。

+0

谢谢,我想我一定误解了新的语法文法 – Luke

0

我使用两个外键和更新级联和删除级联选项创建一个表。

CREATE TABLE category_subcategory 
(
category_subcategory_id INTEGER PRIMARY KEY, 
category_id    INTEGER NOT NULL, 
subcategory_id   INTEGER NOT NULL, 
FOREIGN KEY(category_id) REFERENCES categories(id) ON DELETE CASCADE ON 
UPDATE CASCADE, 
FOREIGN KEY(subcategory_id) REFERENCES subcategories(subcategory_id) ON 
DELETE CASCADE ON UPDATE CASCADE 
); 
1

只是为了补充第一个答案,这是一个很好的做法,一个名字添加到限制,如下面的代码:

create table house_items (
    house_id integer not null, 
    item_id integer not null, 
    constraint house_items_pk primary key (house_id, item_id), 
    constraint house_items_house_fk foreign key (house_id) references houses(id), 
    constraint house_items_items_fk foreign key (item_id) references electrical_items(id));