2011-11-03 38 views
13

Tôi đã đọc khá mát mẻ theo kiểu BNF ngữ pháp cho SQLite tạo bảng báo cáoSQLite chìa khóa composite (2 phím nước ngoài) Liên kết bảng

tìm thấy ở đây: http://www.sqlite.org/lang_createtable.html

tôi đã tự hỏi làm thế nào tôi muốn hãy tạo một bảng liên kết giữa các số này

Tôi có một bảng, cho phép nói, nhà cửa và một thiết bị điện khác.

Tôi muốn tạo bảng liên kết để có house_id và item_id dưới dạng khóa tổng hợp, nhưng tôi không chắc chắn về cách thực hiện, nó dường như không cho phép khóa chính một khóa ngoại?

N.B Tôi muốn một trường thứ ba pap_tested lưu trữ ngày mục điện trong nhà được pap_tested vì vậy bảng liên kết này thông qua tổng hợp khóa chính có vẻ là cách tiếp cận tốt nhất.

Trả lời

27

Một trong những nên làm việc cho bảng hiệp hội của bạn:

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

Bạn có lẽ sẽ muốn separate (single column) indexes on house_items.house_id and house_items.item_id là tốt.

+0

Có đi theo liên kết Tôi không nghĩ rằng nó được áp dụng như house_id là một khóa chính của ngôi nhà và item_id của các mục. – Luke

1

Không có lệnh cấm nào về khóa CHÍNH cũng không phải là chìa khóa NGOẠI HỐI cho những thiết kế yêu cầu loại quan hệ này. Tuy nhiên, vấn đề của bạn không phải là một trong số đó, vì khóa PRIMARY tự nhiên trong bảng nối kết là một tổng hợp của hai cột, mỗi một chìa khóa FOREIGN trở lại một trong các bảng khác.

+0

cảm ơn, tôi nghĩ rằng tôi phải hiểu sai ngữ pháp kiểu mới – Luke

0

Tôi tạo một bảng có hai khóa ngoại và tùy chọn trên tầng cập nhật và trên xóa tầng.

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

Chỉ cần để bổ sung cho câu trả lời đầu tiên, đó là một thực hành tốt để thêm một tên để ràng buộc, như đoạn code dưới đây:

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)); 
Các vấn đề liên quan