MySQL

2008-11-04 19 views
82

में रिश्ते कैसे बनाएं, कक्षा में, हम सभी 'अध्ययन' डेटाबेस हैं, और हर कोई एक्सेस का उपयोग कर रहा है। इसके साथ ऊब गया, मैं ऐसा करने की कोशिश कर रहा हूं कि बाकी वर्ग क्या कर रहा है, लेकिन एक्सेस का उपयोग करने के बजाय कच्चे एसक्यूएल कमांड के साथ MySQL के साथ।MySQL

मैंने डेटाबेस और टेबल बनाने में कामयाब रहा है, लेकिन अब मैं दो तालिकाओं के बीच संबंध कैसे बना सकता हूं?

अगर मैं अपने दो तालिकाओं इस तरह है:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id) 
) 

और

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
) 

मैं दो तालिकाओं के बीच एक 'संबंध' कैसे बनाऊँ? मैं चाहता हूं कि प्रत्येक खाता एक ग्राहक_आईडी 'असाइन करें' (यह इंगित करने के लिए कि इसका मालिक कौन है)।

+26

तुम भी एक दृश्य है जो आप संयुक्त customersaccounts तालिका के प्रभाव देता बना सकते हैं "मैं पहुँच अध्ययन करने के लिए मना कर दिया, मैं एक असली डेटाबेस इंजन का अध्ययन करेंगे: MySQL" ऐसा इसलिए है आत्मा! बधाई = डी – Metafaniel

+1

ध्यान दें कि विदेशी कुंजी बाधाएं संबंधों को लागू नहीं करती हैं, वे अखंडता को लागू करते हैं। खाता तालिका में account_id और customer_id के बीच संबंध संबंधित इकाइयों के बीच संबंध लागू करता है। – reaanb

+1

"यह भावना है!", जब तक यह InnoDB के साथ MySQL है, माईसैम नहीं। इसके अलावा postgreqsl में MySQL पर कुछ रोचक विशेषताएं हैं जो देखने योग्य हैं। – jgmjgm

उत्तर

82

टेबल InnoDB रहे हैं, तो आप इस तरह यह बना सकते हैं:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id), 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
) ENGINE=INNODB; 

आप निर्दिष्ट करने के लिए है कि टेबल क्योंकि MyISAM इंजन विदेशी कुंजी का समर्थन नहीं करता InnoDB हैं। अधिक जानकारी के लिए here देखें।

9

अहोग द्वारा टिप्पणी पर जोड़ना, आपको दोनों टेबल मिलानों पर चाबियों का आकार बनाना चाहिए। बजाय

customer_id INT(4) NOT NULL , 

यह

customer_id INT(10) NOT NULL , 

और सुनिश्चित करें कि ग्राहक तालिका में अपने पूर्णांक स्तंभ पूर्णांक (10) भी है या नहीं।

+1

अच्छा बिंदु, मुझे खेतों के आकार नहीं दिखाई दिए। –

+0

क्यों? fillerfillerfiller – stackPusher

62

रूप ehogue कहा, यह आपके CREATE TABLE में

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

वैकल्पिक रूप से कहें, अगर आप पहले से बनाई गई तालिका है, एक ALTER टेबल आदेश का उपयोग करें:

ALTER TABLE `accounts` 
    ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE; 

एक अच्छा तरीका सीखने शुरू करने के लिए ये आदेश MySQL GUI Tools का उपयोग कर रहे हैं, जो आपको अपने डेटाबेस के साथ काम करने के लिए एक और "दृश्य" इंटरफेस देता है। उस पर वास्तविक लाभ (एक्सेस की विधि से अधिक), यह है कि जीयूआई के माध्यम से अपनी तालिका को डिजाइन करने के बाद, यह आपको वह एसक्यूएल दिखाता है जो इसे चलाने जा रहा है, और इसलिए आप इससे सीख सकते हैं।

+1

आपका उत्तर सबसे अच्छा समाधान – Omar

6

कुछ MySQL इंजन विदेशी कुंजी का समर्थन करते हैं। उदाहरण के लिए, InnoDB विदेशी कुंजी के आधार पर बाधाओं को स्थापित कर सकता है। यदि आप एक तालिका में एक प्रविष्टि को हटाने का प्रयास करते हैं जिसमें दूसरे पर निर्भर है, तो डिलीट विफल हो जाएगी।

यदि आप MySQL में एक टेबल प्रकार का उपयोग कर रहे हैं, जैसे कि माईसाम, जो विदेशी कुंजी का समर्थन नहीं करता है, तो आप अपने आरेखों और प्रश्नों को छोड़कर कहीं भी टेबल को लिंक नहीं करते हैं।

उदाहरण के लिए, एक प्रश्न में आप दो तालिकाओं कुछ चुने हुए बयान में साथ लिंक एक में शामिल होने:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field); 
1

नियम आप को पता है की है की है कि तालिका स्तंभ आप के लिए संदर्भ लेना चाहते हो गया है है उसी डेटा प्रकार के साथ संदर्भ तालिका के साथ। 2 यदि आप mysql का उपयोग करने का निर्णय लेते हैं तो आपको इनो डीबी इंजन का उपयोग करना होगा क्योंकि आपके प्रश्न के अनुसार यह इंजन है जो आप mysql में प्राप्त करना चाहते हैं।

बोलो कोड यह कोशिश करता है कि पहले लोग इस प्रश्न का उत्तर देने के लिए पहले पर 100% महान उत्तर प्रदान करते हैं और कृपया उन सभी पर विचार करें।

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id) 
)ENGINE=InnoDB; 

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
    PRIMARY KEY (account_id), 
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
)ENGINE=InnoDB; 
2

यहाँ मदद मिलेगी संसाधनों की एक जोड़ी आरंभ: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase और http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

के रूप में भी अन्य लोगों ने कहा, एक जीयूआई का उपयोग करें - डाउनलोड करने और Xampp (या Wamp) जो सर्वर-सॉफ्टवेयर को चलाने के स्थापित करने की कोशिश (अपाचे और mySQL) अपने कंप्यूटर पर। फिर जब आप ब्राउज़र में // localhost पर नेविगेट करते हैं, तो एक MySQL डेटाबेस के साथ काम करना शुरू करने के लिए PHPMyAdmin का चयन करें। जैसा ऊपर बताया गया है, आपने अनुरोध किया है कि आप रिश्ते बनाने की अनुमति देने के लिए innoDB का उपयोग करें। यह डेटाबेस टेबल के साथ आप क्या कर रहे हैं यह देखने के लिए आसान ढेर बनाता है। बस समाप्त होने पर अपाचे और mySQL सेवाओं को रोकना याद रखें - ये बंदरगाहों को खोल सकते हैं जो आपको हैकिंग/दुर्भावनापूर्ण खतरों के बारे में बता सकते हैं।

10
CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id) 
) 

and 

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
) 

How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it). 

आपको खुद से यह पूछना है कि यह 1 से 1 रिश्ते या कई रिश्तों में से एक है। यही है, क्या प्रत्येक खाते में ग्राहक होता है और प्रत्येक ग्राहक के पास खाता होता है। या खाते के बिना ग्राहक होंगे। आपका प्रश्न बाद वाले का तात्पर्य है।

यदि आप सख्त 1 से 1 रिश्ते चाहते हैं, तो बस दो टेबल मर्ज करें।

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
) 

दूसरे मामले में, दो तालिकाओं के बीच संबंध बनाने का सही तरीका संबंध तालिका बनाना है।

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL, 
    account_id INT NOT NULL, 
    PRIMARY KEY (customer_id, account_id) 
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade, 
    FOREIGN KEY account_id references accounts (account_id) on delete cascade 
} 

तो अगर आप एक CUSTOMER_ID है और खाते की जानकारी चाहते हैं, आप customersaccounts और खातों पर शामिल होने:

SELECT a.* 
    FROM customersaccounts ca 
     INNER JOIN accounts a ca.account_id=a.account_id 
      AND ca.customer_id=mycustomerid; 

क्योंकि अनुक्रमण के इस blindingly त्वरित किया जाएगा।

जबकि रखते हुए उन्हें अलग

CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca 
     INNER JOIN accounts a ON ca.account_id=a.account_id 
     INNER JOIN customers c ON ca.customer_id=c.customer_id; 
+1

है, मुझे लगता है कि आपका मतलब 'ca.'' ac.' (3 स्थान) नहीं था। –