Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

प्राथमिक और विदेशी कुंजी पर अनुक्रमणिका

आपने जो मुझे बताया उस पर मैं कुछ प्रयोग कर रहा हूं और मैंने सोचा कि मैं इसे उत्तर के रूप में साझा करूंगा।

पहले मैं कुछ टेस्ट टेबल बनाता हूँ:

CREATE TABLE foo (
    foo_id int(10) unsigned NOT NULL,
    PRIMARY KEY (foo_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
CREATE TABLE bar (
    bar_id int(10) unsigned NOT NULL,
    PRIMARY KEY (bar_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;


CREATE TABLE foo_bar (
    foo_id int(10) unsigned NOT NULL,
    bar_id int(10) unsigned NOT NULL
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

अब तक, कोई अनुक्रमणिका मौजूद नहीं है:

mysql> SHOW INDEXES FROM foo_bar;
Empty set (0.00 sec)

प्राथमिक कुंजी जोड़ने से एक इंडेक्स बनता है:

mysql> ALTER TABLE foo_bar
    -> ADD PRIMARY KEY (`foo_id`, `bar_id`);
Query OK, 0 rows affected (0.70 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW INDEXES FROM foo_bar;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| foo_bar |          0 | PRIMARY  |            1 | foo_id      | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| foo_bar |          0 | PRIMARY  |            2 | bar_id      | A         |           0 |     NULL | NULL   |      | BTREE      |         |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
2 rows in set (0.02 sec)

अगर मैं foo_id . पर एक विदेशी कुंजी जोड़ता हूं यह प्राथमिक कुंजी अनुक्रमणिका का पुन:उपयोग करता है क्योंकि वह स्तंभ अनुक्रमणिका में पहला है:

mysql> ALTER TABLE foo_bar
    -> ADD CONSTRAINT `foo_bar_fk1` FOREIGN KEY (`foo_id`) REFERENCES `foo` (`foo_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Query OK, 0 rows affected (0.27 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW INDEXES FROM foo_bar;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| foo_bar |          0 | PRIMARY  |            1 | foo_id      | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| foo_bar |          0 | PRIMARY  |            2 | bar_id      | A         |           0 |     NULL | NULL   |      | BTREE      |         |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
2 rows in set (0.00 sec)

अगर मैं bar_id . पर एक विदेशी कुंजी जोड़ता हूं , यह एक अनुक्रमणिका बनाता है क्योंकि किसी भी मौजूदा अनुक्रमणिका का पुन:उपयोग नहीं किया जा सकता है:

mysql> ALTER TABLE foo_bar
    -> ADD CONSTRAINT `foo_bar_fk2` FOREIGN KEY (`bar_id`) REFERENCES `bar` (`bar_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW INDEXES FROM foo_bar;
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| foo_bar |          0 | PRIMARY     |            1 | foo_id      | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| foo_bar |          0 | PRIMARY     |            2 | bar_id      | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| foo_bar |          1 | foo_bar_fk2 |            1 | bar_id      | A         |           0 |     NULL | NULL   |      | BTREE      |         |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.02 sec)

हमारी एक विदेशी कुंजी प्राथमिक कुंजी अनुक्रमणिका का उपयोग कर रही है। इसका मतलब है कि हम ऐसी अनुक्रमणिका को हटा नहीं सकते!

mysql> ALTER TABLE foo_bar
    -> DROP PRIMARY KEY;
ERROR 1025 (HY000): Error on rename of '.\test\#sql-568_c7d' to '.\test\foo_bar' (errno: 150)

जब तक हम विदेशी कुंजी के लिए एक अनुक्रमणिका नहीं बनाते हैं या हम कुंजी को ही छोड़ देते हैं:

mysql> ALTER TABLE foo_bar
    -> DROP FOREIGN KEY `foo_bar_fk1`;
Query OK, 0 rows affected (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE foo_bar
    -> DROP PRIMARY KEY;
Query OK, 0 rows affected (0.23 sec)
Records: 0  Duplicates: 0  Warnings: 0

निष्कर्ष यह है कि MySQL स्वचालित रूप से अनुक्रमणिका बनाता है जब वे एक कार्यक्षमता के लिए आवश्यक होते हैं (लेकिन केवल तभी जब वे सख्ती से आवश्यक हों)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. किसी प्रक्रिया या ट्रिगर के अंदर mysql ईवेंट कैसे बनाएं?

  2. डेटा को अलग-अलग श्रेणियों में समूहित करने के लिए MySQL क्वेरी

  3. हाइब्रिड OLTP/Analytics डेटाबेस वर्कलोड:MySQL डेटा को ClickHouse में रेप्लिकेट करना

  4. मैं फ़ाइल सिस्टम के बजाय PHP सत्र डेटा को डेटाबेस में कैसे सहेजूँ?

  5. मैसकल में लीड और लैग फंक्शन