2012-12-18 37 views
14

Tôi không phải là một chuyên gia trong sql/sqlite .. giả sử chúng ta có hai bảng:SQLite ví dụ chính nước ngoài

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT, 
); 


CREATE TABLE MyTableB(
    dog TEXT, 
    FOREIGN KEY(dogList) REFERENCES child(id) 
); 

sẽ như thế nào INSERT? chính xác hoạt động của tôi là gì? Tôi muốn có: một đứa trẻ có thể có nhiều hơn một con chó một con chó có thể có nhiều trẻ em

* EDIT * * gì nếu tôi muốn tất cả các trẻ em và cho mỗi đứa trẻ một danh sách chó liên quan đến đứa trẻ đó? *

Trả lời

45

Nhiều-To-Nhiều

Để hỗ trợ một đứa trẻ có số không hay nhiều chó và một con chó thuộc zero hoặc nhiều trẻ em, cấu trúc bảng cơ sở dữ liệu của bạn cần hỗ trợ một Nhiều-To- Nhiều mối quan hệ. Điều này đòi hỏi ba bảng:

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT 
); 


CREATE TABLE dog (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    dog TEXT 
); 

CREATE TABLE child_dog { 
    child_id INTEGER, 
    dog_id INTEGER, 
    FOREIGN KEY(child_id) REFERENCES child(id), 
    FOREIGN KEY(dog_id) REFERENCES dog(id) 
}; 

Làm thế nào để Chèn

Một chèn vào mỗi trong ba bảng phải có câu lệnh SQL riêng biệt, nhưng có thể xảy ra trong bối cảnh tương tự giao dịch. Chèn vào bảng child_dog (được gọi là bảng ánh xạ) phải xảy ra sau khi chèn vào bảng con và con chó. Đây là vì hai lý do liên quan:

  1. Bạn cần biết số nhận dạng của cả trẻ và con chó để để chèn vào bảng này.
  2. Do ràng buộc khóa ngoài, chèn vào bảng child_dog sẽ thất bại nếu con và/hoặc con chó được tham chiếu không tồn tại trong cơ sở dữ liệu hoặc giao dịch.

Dưới đây là một số câu ví dụ SQL cho chèn:

INSERT INTO child VALUES(NULL, 'bobby'); 
SELECT last_insert_rowid(); -- gives the id of bobby, assume 2 for this example 
INSERT INTO dog VALUES(NULL, 'spot'); 
SELECT last_insert_rowid(); -- gives the id of spot, assume 4 for this example 
INSERT INTO child_dog VALUES(2, 4); 

Chèn Trong Python

Mặc dù câu hỏi của bạn không đề cập đến python, có một thẻ python về câu hỏi này vì vậy tôi sẽ giả định bạn muốn biết làm thế nào để làm điều này trong python. Mô-đun sqlite3 trong python cung cấp một phím tắt nhỏ đẹp giúp bạn khỏi phải chạy hàm 'last_insert_rowid()' một cách rõ ràng.

# Import the sqlite3 module 
import sqlite3 
# Create a connection and cursor to your database 
conn = sqlite3.connect('example.db') 
c = conn.cursor() 
# Insert bobby 
c.execute("""INSERT INTO child VALUES(NULL, 'bobby')""") 
# The python module puts the last row id inserted into a variable on the cursor 
bobby_id = c.lastrowid 
# Insert spot 
c.execute("""INSERT INTO dog VALUES(NULL, 'spot')""") 
spot_id = c.lastrowid 
# Insert the mapping 
c.execute("""INSERT INTO child_dog VALUES(?, ?)""", (bobby_id, spot_id)); 
# Commit 
conn.commit() 
conn.close() 
+0

xin lỗi, và nếu tôi muốn thực hiện một SELECT (tất cả), tôi sử dụng một kết nối? truy vấn sẽ như thế nào? – Safari

+2

@GgSalent phụ thuộc vào những gì bạn đang cố truy xuất với lựa chọn của bạn, dưới đây là một số ví dụ: 'SELECT name, dog FROM child, dog, child_dog WHERE child.id = child_dog.child_id AND dog.id = child_dog.dog_id' để chọn tất cả các kết hợp và 'CHỌN con chó FROM child, dog, child_dog WHERE child.id = child_dog.child_id AND dog.id = child_dog.dog_id AND name = 'bobby'' cho những con chó thuộc sở hữu của bobby. Bên trong tham gia, tập hợp với nhóm theo mệnh đề, và đó cũng là tùy chọn tùy thuộc vào thông tin bạn muốn. –

+0

Câu trả lời rất hay, cảm ơn Ken! – dotancohen

1

bạn cần phải có ba bảng cho việc này. Đây là ví dụ về Many-to-Many Mối quan hệ.

Child 
- ChildID (PK) 
- Name 

Dog 
- DogID (PK) 
- DogName 

Child_Dog 
- ChildID (FK) 
- DogID (FK) 
+0

ok, và INSERT sẽ như thế nào? – Safari

+1

bạn cần chèn trước vào bảng 'con' và' con chó'. vì 'Child_Dog' phụ thuộc vào các giá trị của hai bảng. –

+0

nếu con chó hoặc bảng con PK là AUTOINCREMENT loại .. làm thế nào tôi có thể biết giá trị này để chèn nó vào bảng Child_Dog? Một ví dụ về hoạt động ISERT được hoan nghênh .. – Safari

Các vấn đề liên quan