Dasar-dasar Kunci Asing di MySQL?

91

Apakah ada penjelasan yang bagus tentang cara menggunakan konstruksi kunci asing MySQL?

Saya tidak begitu mendapatkannya dari dokumen MySQL sendiri. Sampai sekarang saya telah menangani hal-hal seperti kunci asing dengan gabungan dan kode pemrograman.

Dan bagian kedua dari pertanyaannya, apakah ada perbaikan yang harus dilakukan dengan menggunakan kunci asing bawaan MySQL?

Macha
sumber

Jawaban:

117

FOREIGN KEYS cukup pastikan data Anda konsisten.

Mereka tidak meningkatkan kueri dalam arti efisiensi, mereka hanya membuat beberapa kueri yang salah gagal.

Jika Anda memiliki hubungan seperti ini:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, maka Anda tidak dapat menghapus a departmentjika memiliki beberapa employee.

Jika Anda menyediakan ON DELETE CASCADEkepada FOREIGN KEYdefinisi, baris referensi akan dihapus secara otomatis bersama dengan yang direferensikan.

Sebagai batasan, FOREIGN KEYsebenarnya sedikit memperlambat kueri.

Pemeriksaan ekstra perlu dilakukan saat menghapus dari tabel referensi atau memasukkan ke tabel referensi.

Quassnoi
sumber
1
Perlambatan minimal, karena Anda biasanya membuat FK di bidang terindeks, yang membuat menemukan nilai yang relevan dengan cepat.
Seb
4
Itu sebabnya saya menulis "sedikit" :) Sebenarnya, dari Anda menghapus banyak baris, yang mendasarinya JOINmungkin jauh lebih tidak efisien daripada dua DELETE menggunakan FULL TABLE SCAN
Quassnoi
2
Maaf atas suara negatifnya. Itu tidak disengaja, tetapi tidak memungkinkan saya untuk mengubah suara saya.
Wondercricket
8
@Wondercricket: Saya bahkan tidak tahu apa yang harus saya lakukan sekarang, ini adalah area abu-abu dalam aturan situs. Saya pikir Anda membelikan saya bir ketika Anda berada di Moskow dan kami seimbang.
Quassnoi
1
@stack: pembaruan apa pun yang Anda lakukan pada kaskade kunci yang direferensikan ke tabel referensi.
Quassnoi
32

Manfaat utama menggunakan kunci asing nyata adalah memastikan integritas data, dan dapat mengatur tindakan berjenjang pada item terkait ketika sesuatu diubah atau dihapus.

Misalnya, bayangkan Anda memprogram forum. Anda memiliki tabel "topik" dengan kunci utama topics.topic_id, dan Anda memiliki tabel "posting" di mana posting dilampirkan ke topik dengan kolom posts.topic_id, yang merupakan kunci asing ke tabel topik.

Hubungan kunci asing ini memastikan bahwa setiap posting dilampirkan ke topik yang valid. Jika satu-satunya topik yang Anda miliki memiliki ID # 1, tidak mungkin ada postingan di database yang dilampirkan ke topik # 2. Database memastikan ini.

Untuk keuntungan berjenjang, Anda bisa mengaturnya sehingga jika topik dihapus dari tabel topik, database secara otomatis menghapus semua posting di tabel posting yang dilampirkan ke topik ini. Ini bagus karena menghilangkan langkah yang harus Anda ingat untuk dilakukan secara manual, yang bisa menjadi sangat rumit ketika Anda memiliki banyak tabel yang ditautkan bersama. Dengan kunci asing, semua hubungan dapat dibersihkan secara otomatis.

Chad Birch
sumber
11

1. KUNCI FOREIGN hanya memastikan data Anda konsisten.

2. Jika kita menerapkan delete cascade ke definisi foreign key, baris referensi akan dihapus secara otomatis ketika baris induk akan dihapus.

3. Jika kita menerapkan Update Cascade ke definisi kunci asing, baris Anak akan diperbarui secara otomatis ketika baris induk akan diperbarui.

Query: ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENSI parent (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. Anda tidak dapat menghapus tabel induk langsung, pertama hapus kunci asing dari tabel anak daripada hapus tabel induk.
Gaurav Kumar
sumber
7
Akhirnya saya menyadari apa yang membuat saya bingung tentang contoh kunci asing. Sebagai ayah empat anak, saya tidak terbiasa dengan anak yang mengawasi orang tua . Dalam empat puluh tahun mendatang ini mungkin tidak lagi tampak mundur.
Bob Stein
1
Terima kasih telah memberikan nama tabel contoh Anda seperti "child" dan "parent" ... sebenarnya ini cukup membantu dan saya berharap dokumentasi resminya berhasil!
mike rodent
7

Keuntungan utamanya adalah Anda dapat membatasi nilai mana yang dapat Anda masukkan ke dalam tabel; jika Anda mencoba memasukkan nilai yang tidak ada di tabel yang direferensikan, Anda tidak akan dapat melakukannya.

Selain itu, jika Anda memperbarui atau menghapus nilai dalam tabel yang direferensikan, Anda dapat mengaturnya untuk secara otomatis memperbarui nilai atau menghapus secara berjenjang setiap baris yang berisi nilai tersebut.

Ini memang fitur hebat yang memanfaatkan kode Anda.

Seb
sumber