web-dev-qa-db-ja.com

SQLite複合キー(2つの外部キー)リンクテーブル

SQLite create tableステートメントのかなりクールなスタイルBNF文法を読みました

ここにあります: http://www.sqlite.org/lang_createtable.html

これらの間にリンクテーブルを作成するにはどうすればよいのでしょうか。

たとえば、家と別のelectrical_itemsという1つのテーブルがあります。

House_idとitem_idを複合キーとして持つリンクテーブルを作成したいのですが、どうすればよいかわかりません。主キーを外部キーにすることができないようです。

N.B家の電気製品がpap_testedされた日付を格納する3番目のフィールドpap_testedが必要なので、複合主キーを介したこのリンクテーブルが最善のアプローチのようです。

15
Luke

これらのいずれかが関連付けテーブルで機能するはずです。

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)
)

house_items.house_idhouse_items.item_idの個別の(単一列)インデックスも必要になるでしょう

31
mu is too short

最初の答えを補足するために、以下のコードのように、制約に名前を追加することをお勧めします。

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));
2
Danilo Teodoro

この種の関係を必要とする設計では、PRIMARYKEYがFOREIGNKEYでもないことを禁止するものはありません。ただし、リンクテーブルの自然なPRIMARY KEYは2つの列の複合であり、それぞれが他のテーブルの1つに戻るFOREIGN KEYであるため、問題はそれらの1つではありません。

1
Larry Lustig

2つの外部キーと、更新カスケードと削除カスケードのオプションを使用してテーブルを作成します。

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
 );
0
Suleman Ilyas