MySQL में संबंध कैसे बनाये


97

कक्षा में, हम सभी 'अध्ययनशील' डेटाबेस हैं, और हर कोई एक्सेस का उपयोग कर रहा है। इससे ऊब कर, मैं यह करने की कोशिश कर रहा हूं कि बाकी वर्ग क्या कर रहे हैं, लेकिन एक्सेस का उपयोग करने के बजाय 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,
    PRIMARY KEY ( customer_id )
)

मैं दो तालिकाओं के बीच एक 'संबंध' कैसे बनाऊं? मैं चाहता हूं कि प्रत्येक खाते को एक 'ग्राहक' निर्दिष्ट किया जाए (यह इंगित करने के लिए कि उसका मालिक कौन है)।


48
"मैं अध्ययन का अध्ययन करने के लिए तैयार हूँ, मैं एक असली डेटाबेस इंजन का अध्ययन करूँगा: MySQL" यही भावना है! बधाई = डी
मेटाफैनियल

2
ध्यान दें कि विदेशी प्रमुख बाधाएं रिश्तों को लागू नहीं करती हैं, वे अखंडता को लागू करती हैं। खाता तालिका में account_id और customer_id के बीच संबंध संबंधित संस्थाओं के बीच संबंध को लागू करता है।
21

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

जवाबों:


103

यदि टेबल निर्दोष हैं तो आप इसे इस तरह बना सकते हैं:

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 इंजन विदेशी कुंजी का समर्थन नहीं करता है। अधिक जानकारी के लिए यहां देखें ।


मैंने एक लेख में देखा, कि अगर इंजन को डिफ़ॉल्ट भंडारण इंजन के रूप में परिभाषित किया गया है, तो इंजन = इनोबीडी क्लॉज को निर्दिष्ट करने की कोई आवश्यकता नहीं है, कमांड (mysql> SELECT @@ default_storage_engine;)
अरुण

80

जैसा कि एहोग ने कहा, इसे अपने क्रिएट टेबल में डालें

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

वैकल्पिक रूप से, यदि आपके पास पहले से ही बनाई गई तालिका है, तो ALTER TABLE कमांड का उपयोग करें:

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

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


3
आपका उत्तर सबसे अच्छा समाधान है
उमर

14
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 से 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;

इंडेक्सिंग की वजह से यह अंधाधुंध होगा।

आप एक अलग दृश्य भी बना सकते हैं जो आपको अलग-अलग रखते हुए संयुक्त ग्राहकों की तालिका का प्रभाव देता है

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
मुझे लगता है कि आपका मतलब (3 जगह) ca.नहीं था ac.
अण्डाकार दृश्य

आपने PRIMARY KEY (customer_id, account_id)इसके बाद अल्पविराम के बिना लिखा
Theonlygusti

11

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

customer_id INT( 4 ) NOT NULL ,

इसे बनाओ

customer_id INT( 10 ) NOT NULL ,

और यह सुनिश्चित करें कि ग्राहकों की तालिका में आपका इंट कॉलम इंट (10) भी है।


7

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

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

उदाहरण के लिए, एक क्वेरी में आप एक चयन में दो तालिकाओं को एक जुड़ाव के साथ जोड़ते हैं:

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

2

यहाँ कुछ संसाधन दिए गए हैं जो आरंभ करने में मदद करेंगे: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase और http://code.tutsplus.com/articles/sql-for-bebners-part- 3-डेटाबेस-संबंध - नेट 8561

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


यदि आप अपाचे और mysql को केवल स्थानीय अनुरोधों के लिए सेट करते हैं तो आपको उन्हें रोकने की आवश्यकता नहीं है। इसके अलावा उपयोगकर्ताओं को कम से कम एक सॉफ्टवेयर फ़ायरवॉल स्थापित करना चाहिए यदि इस प्रकार की सेवाओं को स्थापित किया जाए। उस कहावत के साथ, कई होम राउटर उन में निर्मित फ़ायरवॉल के साथ आते हैं, इसलिए बंदरगाहों को किसी भी तरह से तब तक नहीं खोला जाना चाहिए जब तक कि वे किसी राउटर तक पहुंच के साथ किसी द्वारा नहीं खोले गए हों।
क्रिस

1

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

Bellow वह कोड है जो इसे आज़माता है, हालांकि पहले लोग इस प्रश्न का उत्तर देते हैं कि उन्होंने 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; 

0
create table departement(
    dep_id      int primary key auto_increment,
    dep_name    varchar(100) not null,
    dep_descriptin      text,
    dep_photo       varchar(100) not null,
    dep_video       varchar(300) not null
);

create table newsfeeds(
    news_id         int primary key auto_increment,
    news_title      varchar(200) not null,
    news_description    text,
    news_photo          varchar(300) ,
    news_date           varchar(30) not null,
    news_video          varchar(300),
    news_comment        varchar(200),
    news_departement    int foreign key(dep_id) references departement(dep_id)
);

कृपया आपके द्वारा प्रदान किए गए स्कीमा पर कुछ स्पष्टीकरण दें।
सामबेदे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.