2010-09-23 13 views
12

हो सकती है क्या उसी कॉलम में प्राथमिक कुंजी & किसी अन्य कॉलम पर विदेशी कुंजी बाधा हो सकती है?क्या उसी कॉलम में प्राथमिक कुंजी और विदेशी कुंजी बाधा अन्य कॉलम

Table1: ID - Primary column, foreign key constraint for Table2 ID 
Table2: ID - Primary column, Name 

यदि मैं तालिका 1 डेटा को हटाने का प्रयास करता हूं तो यह एक मुद्दा होगा?

Delete from table1 where ID=1000; 

धन्यवाद।

+0

आप 'करूँगा इस लिंक में जवाब खोजने [कर सकते हैं एक डेटाबेस विशेषता प्राथमिक और विदेशी कुंजी हो?] (http://stackoverflow.com/questions/9244432/can-a-database-attribute-be-primary-and-foreign-key) –

उत्तर

18

इसके साथ कोई समस्या नहीं होनी चाहिए।

CREATE TABLE table2 (
    id int PRIMARY KEY, 
    name varchar(20) 
) ENGINE=INNODB; 

CREATE TABLE table1 (
    id int PRIMARY KEY, 
    t2_id int, 
    FOREIGN KEY (t2_id) REFERENCES table2 (id) 
) ENGINE=INNODB; 

INSERT INTO table2 VALUES (1, 'First Row'); 
INSERT INTO table2 VALUES (2, 'Second Row'); 

INSERT INTO table1 VALUES (1, 1); 
INSERT INTO table1 VALUES (2, 1); 
INSERT INTO table1 VALUES (3, 1); 
INSERT INTO table1 VALUES (4, 2); 

टेबल अब शामिल:

SELECT * FROM table1; 
+----+-------+ 
| id | t2_id | 
+----+-------+ 
| 1 |  1 | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
+----+-------+ 
4 rows in set (0.00 sec) 

SELECT * FROM table2; 
+----+------------+ 
| id | name  | 
+----+------------+ 
| 1 | First Row | 
| 2 | Second Row | 
+----+------------+ 
2 rows in set (0.00 sec) 

अब हम सफलतापूर्वक पंक्तियों इस तरह नष्ट कर सकते हैं:

DELETE FROM table1 WHERE id = 1; 
Query OK, 1 row affected (0.00 sec) 

DELETE FROM table1 WHERE t2_id = 2; 
Query OK, 1 row affected (0.00 sec) 

लेकिन हम नष्ट करने के लिए सक्षम नहीं होगा निम्नलिखित उदाहरण पर विचार निम्नलिखित:

DELETE FROM table2 WHERE id = 1; 
ERROR 1451 (23000): A foreign key constraint fails 

अगर हम CASCADE विकल्प के साथ table1 पर विदेशी कुंजी परिभाषित किया था, हम माता पिता को नष्ट करने में सक्षम हो गया होता, और सभी बच्चों को अपने आप ही हट जायेगा:

CREATE TABLE table2 (
    id int PRIMARY KEY, 
    name varchar(20) 
) ENGINE=INNODB; 

CREATE TABLE table1 (
    id int PRIMARY KEY, 
    t2_id int, 
    FOREIGN KEY (t2_id) REFERENCES table2 (id) ON DELETE CASCADE 
) ENGINE=INNODB; 

INSERT INTO table2 VALUES (1, 'First Row'); 
INSERT INTO table2 VALUES (2, 'Second Row'); 

INSERT INTO table1 VALUES (1, 1); 
INSERT INTO table1 VALUES (2, 1); 
INSERT INTO table1 VALUES (3, 1); 
INSERT INTO table1 VALUES (4, 2); 

हम दोहराने के लिए थे, तो पहले से DELETE में विफल रहा है , table1 में बच्चों पंक्तियों table2 में माता-पिता पंक्ति के रूप में रूप में अच्छी तरह से हटा दिया जाएगा:

DELETE FROM table2 WHERE id = 1; 
Query OK, 1 row affected (0.00 sec) 

SELECT * FROM table1; 
+----+-------+ 
| id | t2_id | 
+----+-------+ 
| 4 |  2 | 
+----+-------+ 
1 row in set (0.00 sec) 

SELECT * FROM table2; 
+----+------------+ 
| id | name  | 
+----+------------+ 
| 2 | Second Row | 
+----+------------+ 
1 row in set (0.00 sec) 
+23

अगर मैं गलत हूं तो कृपया मुझे सही करें, लेकिन मैं नहीं देखता कि यह सवाल का जवाब कैसे देता है। (और यह क्यों स्वीकार कर लिया गया है।) सवाल यह पूछ रहा है कि क्या हमारे पास एक ही कॉलम में प्राथमिक कुंजी और विदेशी कुंजी बाधा किसी दूसरे कॉलम पर हो सकती है। स्वीकार्य उत्तर एक विदेशी कॉल के रूप में एक दूसरा कॉलम (t2_id) प्रस्तुत करता है, यह एक स्तंभ नहीं दिखाता है जो प्राथमिक कुंजी और विदेशी कुंजी दोनों है। –

+4

और मैंने सोचा कि मुझे यहां जवाब मिलेगा: / – Saleem

0

हाँ, यह कर सकते हैं।

नहीं, यह नहीं होगा।

पीएस लेकिन आप स्पष्ट तालिका 1 पंक्तियों को हटाए बिना तालिका 2 डेटा को हटाने में सक्षम नहीं होंगे।

पी.पी.एस. मैंने पोस्टग्रेज़ में ऐसी संरचना लागू की है, लेकिन यह MySQL के लिए समान होना चाहिए।

3

----- बताए प्राथमिक कुंजी और एक तालिका में समान स्तंभ को विदेशी कुंजी --------

create table a1 
(
id1 int not null primary key 
) 

insert into a1 values(1),(2),(3),(4) 


create table a2 
(
id1 int not null primary key foreign key references a1(id1) 

) 
insert into a2 values(1),(2),(3) 
संबंधित मुद्दे