2012-12-18 40 views
14

मैं एसक्यूएल/SQLite में एक विशेषज्ञ .. लगता नहीं कर रहा हूँ हम दो तालिकाओं है:SQLite विदेशी कुंजी उदाहरण

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


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

कैसे डाल देगा? मेरे createTable संचालन सही है? मैं करना चाहते हैं: एक बच्चे एक से अधिक कुत्ते एक कुत्ते से अधिक बच्चे

हो सकता है हो सकता है

* संपादित * * क्या होगा यदि मैं सभी बच्चों चाहता था और प्रत्येक बच्चे के लिए उस बच्चे से जुड़े कुत्तों की एक सूची? *

उत्तर

45

कई-से-अनेक

आदेश एक बच्चे शून्य या अधिक कुत्तों और एक कुत्ते को शून्य या अधिक बच्चों से संबंधित होने का समर्थन करने के लिए, अपने डेटाबेस तालिका संरचना एक कई-हैं- समर्थन करने के लिए की जरूरत है कई संबंध। इस तीन तालिकाओं की आवश्यकता है:

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

कैसे

तीन तालिकाओं में से प्रत्येक में एक डालने सम्मिलित अलग SQL कथन होना चाहिए, लेकिन एक ही लेन-देन के संदर्भ में जगह ले सकते हैं। child_dog तालिका (मानचित्रण तालिका के रूप में जाना जाता है) में इंसर्ट बच्चे और कुत्ते तालिकाओं में आवेषण के बाद क्या करना चाहिए।

  1. आप इस तालिका में डालने के लिए करने के क्रम में दोनों बच्चे और कुत्ते के पहचानकर्ता पता करने की जरूरत: यह दो संबंधित कारणों के लिए है।
  2. विदेशी कुंजी बाधा की वजह से, child_dog तालिका में एक डालने अगर बच्चे और/या कुत्ता संदर्भित डेटाबेस या लेन-देन में मौजूद नहीं है विफल हो जाएगा।

यहाँ डालने के लिए कुछ उदाहरण SQL कथन हैं:

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

अजगर

अपने प्रश्न अजगर का उल्लेख नहीं था हालांकि में सम्मिलित करना, वहाँ है इस प्रश्न पर एक अजगर टैग तो मैं मान लेंगे आप जानना चाहते हैं कि पायथन में यह कैसे करें। अजगर में sqlite3 मॉड्यूल एक अच्छी छोटी शॉर्टकट जो आप 'last_insert_rowid()' समारोह स्पष्ट रूप से चलाने के लिए होने से बचाता है प्रदान करता है।

# 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

क्षमा करें, और यदि मैं एक चयन (सभी) करना चाहता हूं, तो मैं एक जॉइन का उपयोग करता हूं? क्वेरी कैसे होगी? – Safari

+2

@GgSalent आप अपने चयन के साथ पुनः प्राप्त करने का प्रयास कर रहे हैं, इस पर निर्भर करता है, यहां कुछ उदाहरण दिए गए हैं: 'बच्चे का चयन करें, कुत्ते, बच्चे_डॉग जहां बच्चे.आईडी = child_dog.child_id और कुत्ता।id = child_dog.dog_id' सभी संयोजनों का चयन करने के लिए और 'कुत्ते, कुत्ते, child_dog से चुनें कुत्ता चुनें जहां baby.id = child_dog.child_id और dog.id = child_dog.dog_id और नाम =' बॉबी 'कुत्ते के स्वामित्व वाले कुत्तों के लिए है। आंतरिक जुड़ता है, समूह द्वारा समूह के साथ एकत्रित होता है, और इस तरह के विकल्प भी हैं जो आप चाहते हैं कि आप क्या चाहते हैं। –

+0

बहुत अच्छा जवाब, धन्यवाद केन! – dotancohen

1

आप इस के लिए तीन टेबल की आवश्यकता है। यह Many-to-Many रिश्ता का एक उदाहरण है।

Child 
- ChildID (PK) 
- Name 

Dog 
- DogID (PK) 
- DogName 

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

ठीक है, और INSERT कैसे होगा? – Safari

+1

आप 'child' और' dog' टेबल पर पहले डालना होगा। चूंकि 'Child_Dog' दो तालिकाओं के मानों पर निर्भर है। –

+0

यदि कुत्ता या बाल तालिका पीके ऑटोमेशन प्रकार है..मैं इसे चाइल्ड_Dog तालिका में डालने के लिए इस मूल्य को कैसे जान सकता हूं? आईएसईआरटी ऑपरेशन का एक उदाहरण स्वागत है .. – Safari