2010-12-30 24 views
5

I'am MySQL के लिए नए के साथ कई तालिकाओं में डालने के लिए है, तो कृपया अच्छा :)MySQL - कैसे विदेशी कुंजी

मैं 3 अलग तालिकाओं में एक php रूप से डेटा सम्मिलित करना चाहते हैं, जो सभी विदेशी है चांबियाँ। मैं एक सम्मिलित आदेश कैसे लिख सकता हूं जो एक ही समय में सभी 3 टेबल अपडेट करता है, क्योंकि यदि मैं मैन्युअल रूप से तालिका को अद्यतन करने का प्रयास करता हूं तो मुझे अनुपलब्ध संदर्भों के कारण त्रुटि मिलती है। क्या मुझे "नल" प्रविष्टियों से निपटना है और प्रत्येक तालिका को दूसरे के बाद अपडेट करना है या क्या इसे एक ही कमांड के साथ हल करना संभव है? MySQLi_Multi_Query की तरह?

बहुत बहुत धन्यवाद!

+0

आप स्कीमा के प्रासंगिक अनुभाग पोस्ट कर सके चाहिए आप तार्किक प्रतिबंध से बचना चाहते हैं, कृपया? –

उत्तर

5

आपको उनकी निर्भरता के क्रम में चीजों को सम्मिलित करने की संभावना है। तो यदि आपके पास तीन टेबल (ए, बी, और सी) हैं तो हम मानेंगे कि सी बी पर निर्भर करता है और बी ए पर निर्भर करता है। हम यह भी मान लेंगे कि प्रत्येक तालिका में क्रमशः प्राथमिक कुंजी एआईडी, बीआईडी ​​और सीआईडी ​​है।

  1. आप अपनी पंक्ति ए में डालेंगे और एआईडी प्राप्त करेंगे।
  2. फिर आप चरण 1 से प्राप्त एआईडी का उपयोग करके बी में अपनी पंक्ति डालेंगे।
  3. फिर आप चरण 2 से प्राप्त बीआईडी ​​(और शायद एआईडी) का उपयोग करके अपनी पंक्ति को सी में डालेंगे (और शायद 1)
+0

बहुत बहुत धन्यवाद। इससे बहुत मदद मिली। – Crayl

+0

आपके रास्ते में, हमें एक-एक करके एसक्यूएल निष्पादित करना होगा, इससे perfmance समस्याओं का कारण बन सकता है। क्या कोई समाधान है जो इन सभी संबंधित पंक्तियों को एक वर्ग में सम्मिलित कर सकता है? अब, मैं सोच रहा हूं, अगर मैं अभी एआईडी की सूची को बिना पंक्तियों के पंक्तियों के प्राप्त कर सकता हूं? – oppo

+0

आप MySQL के साथ थोक आवेषण में देख सकते हैं (मुझे केवल एमएसएसक्यूएल में इसका अनुभव है)। फिर आप सभी तीन थोक आवेषण लेनदेन में लपेट सकते हैं (इसलिए अगर कोई विफल रहता है, तो सभी वापस लुढ़क जाते हैं) –

21

आप 3 तरीके में कर सकते हैं:

पहले & अनुशंसित। सम्मिलित करें मूल्य में चयन का उपयोग:

INSERT INTO user (name) 
    VALUES ('John Smith'); 
INSERT INTO user_details (id, weight, height) 
    VALUES ((SELECT id FROM user WHERE name='John Smith'), 83, 185); 

दूसरा। INSERT VALUE में LAST_INSERT_ID का उपयोग करना:

INSERT INTO a (id) 
    VALUES ('anything'); 
INSERT INTO user_details (id, weight, height) 
    VALUES (LAST_INSERT_ID(),83, 185); 

तीसरा। उपयोग PHP स्क्रिप्ट

<?php 
// Connecting to database 
$link = mysql_connect($wgScriptsDBServerIP, $wgScriptsDBServerUsername, $wgScriptsDBServerPassword, true); 
if(!$link || [email protected]_SELECT_db($wgScriptsDBName, $link)) { 
echo("Cant connect to server"); 
    exit; 
} 

// Values to insert 
$name = 'John Smith'; 
$weight = 83; 
$height = 185; 

// insertion to user table 
$sql = "INSERT INTO user (name) VALUES ('$name')"; 
$result = mysql_query($sql,$conn); 
// retrieve last id 
$user_id = mysql_insert_id($conn); 
mysql_free_result($result); 

// insertion to user_details table 
$sql = "INSERT INTO user_details (id, weight, height) VALUES ($user_id, $weight, $height)"; 
$result = mysql_query($sql,$conn); 
mysql_free_result($result); 
?> 
2

1.

INSERT INTO user_details (id, weight, height) 
    VALUES (SELECT(id FROM user WHERE name='John Smith'), 83, 185); 

होना चाहिए विधि के लिए अपने वाक्य रचना में कोई त्रुटि

INSERT INTO user_details (id, weight, height) 
    VALUES ((SELECT id FROM user WHERE name='John Smith'), 83, 185); 
1

1) foreign_key की भावना एक मूल्य संबद्ध करने के लिए किया जाता है एक क्षेत्र में कहीं और pre_existing मूल्य के साथ। तो आपको अपने आवेषण को तर्क क्रम में बनाना चाहिए।

2) आप

SET foreign_key_checks = 0 // disable key checks in server 
INSERT ... // any order 
INSERT ... 
... 
SET foreign_key_checks = 1 
संबंधित मुद्दे