Kunci asing adalah kolom (atau kombinasi kolom) dalam tabel yang nilainya harus cocok dengan nilai kolom di beberapa tabel lain. 9 kendala menegakkan integritas referensial, yang pada dasarnya mengatakan bahwa jika nilai kolom A mengacu pada nilai kolom B, maka nilai kolom B harus ada Show
Misalnya, diberikan tabel 0 dan tabel 1, jika Anda membuat kolom 2 yang mereferensikan 3 primary key
Untuk mempelajari lebih lanjut tentang dasar-dasar kunci asing, tonton video berikut Tip Untuk membaca selengkapnya tentang cara kerja kunci asing, lihat Apa itu Kunci Asing? DetailAturan untuk membuat kunci asingKolom Kunci Asing
Kolom Referensi
Nilai nolKunci asing satu kolom menerima nilai nol Kunci asing multi-kolom (komposit) hanya menerima nilai nol dalam skenario berikut
Untuk informasi selengkapnya tentang kunci asing komposit, lihat bagian Perhatikan bahwa mengizinkan nilai null baik dalam kunci asing atau kolom yang direferensikan dapat menurunkan integritas referensialnya, karena kunci apa pun dengan nilai null tidak pernah diperiksa terhadap tabel yang direferensikan. Untuk menghindarinya, Anda dapat menggunakan batasan _23 pada kunci asing saat membuat tabel AndaCatatan Kendala _23 tidak dapat ditambahkan ke tabel yang adaPencocokan kunci asing kompositSecara default, kunci asing komposit dicocokkan menggunakan 22 algoritma (yang merupakan default yang sama dengan PostgreSQL). 21 tersedia jika ditentukan. Anda dapat menentukan 21 dan 22Semua pencocokan kunci komposit ditentukan sebelum versi 19. 1 gunakan metode perbandingan _22. Jika Anda memiliki batasan kunci asing gabungan dan baru saja memutakhirkan ke versi 19. 1, lalu harap periksa bahwa 22 berfungsi untuk skema Anda dan pertimbangkan untuk mengganti batasan kunci asing itu dengan yang 21Bagaimana itu bekerjaUntuk tujuan pencocokan, kunci asing komposit dapat berada di salah satu dari tiga status
22 menetapkan bahwa
21 menetapkan bahwa
Untuk contoh yang menunjukkan cara kerja algoritme pencocokan kunci ini, lihat Catatan CockroachDB tidak mendukung 40. Untuk informasi selengkapnya, lihat edisi #20305Tindakan kunci asingSaat Anda menyetel batasan kunci asing, Anda dapat mengontrol apa yang terjadi pada kolom yang dibatasi saat kolom yang direferensikan (kunci asing) dihapus atau diperbarui ParameterDescription 41Default action. Jika ada referensi ke kunci yang dihapus, transaksi akan gagal di akhir pernyataan. Kunci dapat diperbarui, tergantung pada tindakan ________12______42Alias. 43 44Default action. Jika ada referensi ke kunci yang sedang diperbarui, transaksi akan gagal di akhir pernyataan. Kunci dapat dihapus, tergantung pada tindakan ________12______45Alias. 46 43 / 46 49 dan 50 saat ini setara sampai opsi untuk menunda pemeriksaan kendala ditambahkan. Untuk menyetel tindakan kunci asing yang ada ke 49, batasan kunci asing harus dihapus dan dibuat ulang. 52 / 53Ketika kunci asing yang direferensikan dihapus atau diperbarui, semua baris yang mereferensikan kunci itu masing-masing dihapus atau diperbarui. Jika ada perubahan lain pada baris, seperti 54 atau 55, penghapusan akan diutamakanPerhatikan bahwa _56 tidak mencantumkan objek yang dijatuhkan atau diperbarui, jadi harus digunakan dengan hati-hati. 57 / 58Ketika kunci asing yang direferensikan masing-masing dihapus atau diperbarui, kolom dari semua baris yang mereferensikan kunci itu akan disetel ke 6. Kolom harus membolehkan _6 atau pembaruan ini akan gagal. 61 / 62Ketika kunci asing yang direferensikan dihapus atau diperbarui, kolom dari semua baris yang mereferensikan kunci itu disetel ke nilai default untuk kolom ituJika nilai default untuk kolom adalah nol, atau jika tidak ada nilai default yang diberikan dan kolom tidak memiliki batasan 23, ini akan memiliki efek yang sama seperti 57 atau 58. Nilai default harus tetap sesuai dengan semua batasan lainnya, seperti 04Catatan Jika kolom kunci asing memiliki beberapa batasan yang mereferensikan kolom yang sama, aksi kunci asing yang ditentukan oleh kunci asing pertama diutamakan. Sebagai contoh, lihat PertunjukanKarena batasan kunci asing memerlukan pemeriksaan per-baris pada dua tabel, pernyataan yang melibatkan kunci asing atau kolom yang direferensikan membutuhkan waktu lebih lama untuk dijalankan Untuk meningkatkan kinerja kueri, sebaiknya lakukan hal berikut
SintaksisKendala kunci asing dapat didefinisikan di. Namun, jika Anda hanya ingin menerapkan batasan pada satu kolom, batasan tersebut dapat diterapkan di kolom Catatan Anda juga dapat menambahkan batasan _9 ke tabel yang sudah adaTingkat kolomCREATETABLEtable_name(column_namecolumn_typeREFERENCESparent_table(ref_column_name)column_constraints,column_table_deftable_constraints)) ParameterDescription _73Nama tabel yang Anda buat. 74Nama kolom kunci asing. 75Tipe data kolom kunci asing. 76Nama tabel referensi kunci asing. 77Nama kolom referensi kunci asingJika Anda tidak menyertakan _77 yang ingin Anda rujuk dari 76, CockroachDB menggunakan kolom pertama dari kunci utama 76. 81 Batasan tingkat kolom lainnya yang ingin Anda terapkan ke kolom ini. 82Definisi untuk kolom lain dalam tabel. 83 Batasan tingkat tabel apa pun yang ingin Anda terapkanContoh ikon/tombol/salin
Peringatan 56 tidak mencantumkan objek yang dijatuhkan atau diperbarui, jadi harus digunakan dengan hati-hatiTingkat mejaCREATETABLEtable_name(column_table_def,CONSTRAINTconstraint_nameFOREIGN KEY(fk_column_name,)REFERENCESparent_table(ref_column_name,)table_constraints) ParameterDescription _73Nama tabel yang Anda buat. 82Definisi untuk kolom tabel. 87Nama kendala. 88Nama kolom kunci asing. 76Nama tabel referensi kunci asing. 77Nama kolom referensi kunci asingJika Anda tidak menyertakan _74 yang ingin Anda rujuk dari 76, CockroachDB menggunakan kolom pertama dari kunci utama 76. 83 Batasan tingkat tabel lainnya yang ingin Anda terapkanContoh ikon/tombol/salin
Contoh penggunaanGunakan batasan kunci asing dengan tindakan defaultDalam contoh ini, kita akan membuat tabel dengan batasan kunci asing dengan default ( 95)Pertama, buat tabel referensi ikon/tombol/salin
Selanjutnya, buat tabel referensi ikon/tombol/salin
Mari masukkan record ke dalam setiap tabel ikon/tombol/salin
ikon/tombol/salin
Penyisipan catatan kedua mengembalikan kesalahan karena pelanggan 96 tidak ada di tabel yang direferensikanMari masukkan record ke tabel referensi dan coba perbarui tabel referensi ikon/tombol/salin
ikon/tombol/salin
_Pembaruan ke tabel yang direferensikan mengembalikan kesalahan karena 97 direferensikan dan default diaktifkan ( 44). Namun, _99 tidak dirujuk dan dapat diperbaruiikon/tombol/salin 0ikon/tombol/salin 1 2Sekarang mari kita coba menghapus baris yang direferensikan ikon/tombol/salin 3 _Demikian pula, penghapusan mengembalikan kesalahan karena 97 direferensikan dan default diaktifkan ( 41). Namun, 02 tidak dirujuk dan dapat dihapusikon/tombol/salin 5ikon/tombol/salin 1 7Gunakan Batasan Kunci Asing dengan CREATE TABLE packages ( customer INT, "order" INT, id INT, address STRING(50), delivered BOOL, delivery_date DATE, PRIMARY KEY (customer, "order", id), CONSTRAINT fk_order FOREIGN KEY (customer, "order") REFERENCES orders ); 56Dalam contoh ini, kita akan membuat tabel dengan batasan kunci asing dengan 53 dan 52Pertama, buat tabel referensi ikon/tombol/salin 8Kemudian, buat tabel referensi ikon/tombol/salin _9Masukkan beberapa catatan ke dalam tabel yang direferensikan ikon/tombol/salin _0Masukkan beberapa catatan ke dalam tabel referensi ikon/tombol/salin _1Sekarang, mari perbarui _06 di tabel referensiikon/tombol/salin _2ikon/tombol/salin _3 _4ikon/tombol/salin _5 _6Ketika _07 telah diperbarui ke 08 di 09, pembaruan disebarkan ke tabel referensi 10Demikian pula, penghapusan akan mengalir. Ayo hapus _08 dari 09ikon/tombol/salin _7ikon/tombol/salin _3 _9Mari kita periksa untuk memastikan baris di 10 di mana 14 juga dihapusikon/tombol/salin _5 _1Gunakan Batasan Kunci Asing dengan CREATE TABLE packages ( customer INT, "order" INT, id INT, address STRING(50), delivered BOOL, delivery_date DATE, PRIMARY KEY (customer, "order", id), CONSTRAINT fk_order FOREIGN KEY (customer, "order") REFERENCES orders ); 54Dalam contoh ini, kita akan membuat tabel dengan batasan kunci asing dengan 58 dan 57Pertama, buat tabel referensi ikon/tombol/salin _2Kemudian, buat tabel referensi ikon/tombol/salin _3Masukkan beberapa catatan ke dalam tabel yang direferensikan ikon/tombol/salin _4Masukkan beberapa catatan ke dalam tabel referensi ikon/tombol/salin _5ikon/tombol/salin _6 _7Sekarang, mari perbarui _06 di tabel referensiikon/tombol/salin _8ikon/tombol/salin _9 _4ikon/tombol/salin _6 _2Saat 07 diperbarui menjadi 08 di 21, referensi 22 diatur ke 6Demikian pula, penghapusan akan mengatur referensi 22 ke 6. Ayo hapus _26 dari 21ikon/tombol/salin _3ikon/tombol/salin _9 _5Mari kita periksa untuk memastikan baris di 28 di mana 29 diperbarui menjadi 6ikon/tombol/salin _6 _7Gunakan Batasan Kunci Asing dengan CREATE TABLE packages ( customer INT, "order" INT, id INT, address STRING(50), delivered BOOL, delivery_date DATE, PRIMARY KEY (customer, "order", id), CONSTRAINT fk_order FOREIGN KEY (customer, "order") REFERENCES orders ); 55Dalam contoh ini, kita akan membuat tabel dengan batasan 32 dengan batasan 62 dan 61Pertama, buat tabel referensi ikon/tombol/salin _8Kemudian, buat tabel referensi dengan nilai 35 untuk 22 diatur ke 37ikon/tombol/salin _9Masukkan beberapa catatan ke dalam tabel yang direferensikan ikon/tombol/salin _0Masukkan beberapa catatan ke dalam tabel referensi ikon/tombol/salin _1ikon/tombol/salin _2 _7Sekarang, mari perbarui _06 di tabel referensiikon/tombol/salin _4ikon/tombol/salin _5 _6ikon/tombol/salin _2 _8Ketika _07 telah diperbarui ke 08 di 41, referensi 22 diatur ke 35 (i. e. , _37). Anda dapat melihat ini di baris pertama dan terakhir 45, dengan 46 dan 22 sekarang menjadi 37Demikian pula, penghapusan akan mengatur referensi 22 ke nilai 35. Ayo hapus _26 dari 41ikon/tombol/salin _9ikon/tombol/salin _5 _1Mari kita periksa untuk memastikan nilai 22 yang sesuai dengan 54, telah diperbarui ke nilai 35 (i. e. , _37) di 45ikon/tombol/salin _2 _3Jika nilai default untuk kolom _22 tidak disetel, dan kolom tidak memiliki batasan 23, tindakan 62 dan 61, tetapkan nilai kolom referensi ke 6Misalnya, mari buat tabel ________104______63 baru dan masukkan beberapa nilai ikon/tombol/salin _4ikon/tombol/salin _5Kemudian kita dapat membuat tabel _64 baru yang mereferensikan tabel 63, tetapi tanpa nilai default yang ditentukan untuk tindakan 62 dan 61ikon/tombol/salin _6ikon/tombol/salin _7Menghapus dan memperbarui nilai dalam tabel 63 menetapkan nilai referensi dalam 64 hingga 6ikon/tombol/salin _8ikon/tombol/salin _9ikon/tombol/salin _0 _1Tambahkan beberapa batasan kunci asing ke satu kolomAnda dapat menambahkan lebih dari satu batasan kunci asing ke satu kolom Misalnya, jika Anda membuat tabel berikut ikon/tombol/salin _2ikon/tombol/salin _3Anda dapat membuat tabel dengan kolom yang mereferensikan kolom di tabel 1 dan 0ikon/tombol/salin _4Sisipan ke dalam tabel 73 harus memenuhi kedua batasan kunci asing pada 22 ( 75 dan 76)Mari masukkan record ke dalam setiap tabel ikon/tombol/salin _5ikon/tombol/salin _6ikon/tombol/salin _7Pernyataan terakhir berhasil karena _77 cocok dengan nilai unik 06 dalam tabel 1 dan nilai unik 22 dalam tabel 0. Jika _77 tidak ada di salah satu kolom yang direferensikan, atau hanya di salah satunya, pernyataan itu akan mengembalikan kesalahanMisalnya, pernyataan berikut hanya memenuhi salah satu batasan kunci asing dan mengembalikan kesalahan ikon/tombol/salin _8 _9CockroachDB memungkinkan Anda menambahkan beberapa batasan kunci asing pada kolom yang sama, yang mereferensikan kolom yang sama ikon/tombol/salin 0ikon/tombol/salin _1 _2Sekarang ada dua batasan kunci asing pada 22 yang mereferensikan kolom 84 (i. e. , _75 dan 76)Jika terjadi _87 atau 88 ke kolom yang direferensikan ( 84), tindakan untuk kunci asing pertama yang ditentukan diutamakan. Dalam hal ini, itu akan menjadi default ( 95) pada batasan kunci asing pertama ( 75). Ini berarti bahwa 87s pada kolom yang direferensikan akan gagal, meskipun batasan kunci asing kedua ( 93) ditentukan dengan tindakan 52ikon/tombol/salin _3 _4Cocokkan kunci asing gabungan dengan CREATE TABLE packages ( customer INT, "order" INT, id INT, address STRING(50), delivered BOOL, delivery_date DATE, PRIMARY KEY (customer, "order", id), CONSTRAINT fk_order FOREIGN KEY (customer, "order") REFERENCES orders ); _22 dan CREATE TABLE packages ( customer INT, "order" INT, id INT, address STRING(50), delivered BOOL, delivery_date DATE, PRIMARY KEY (customer, "order", id), CONSTRAINT fk_order FOREIGN KEY (customer, "order") REFERENCES orders ); 21Contoh di bagian ini menunjukkan cara kerja pencocokan kunci asing gabungan untuk algoritme ________12______22 dan 21. Untuk ikhtisar konseptual, lihatPertama, mari buat beberapa tabel. _99 adalah tabel dengan kunci gabunganikon/tombol/salin 5 _00 memiliki kunci asing di 99 yang menggunakan 21 algoritmaikon/tombol/salin _6 _03 memiliki kunci asing di 99 yang menggunakan 22 algoritma (default)ikon/tombol/salin _7Selanjutnya, kami mengisi _99 dengan beberapa nilaiikon/tombol/salin _8Sekarang mari kita lihat beberapa pernyataan _68 untuk melihat bagaimana algoritma pencocokan kunci yang berbeda bekerjaCOCOK SEDERHANAMemasukkan nilai ke dalam tabel menggunakan 21 algoritma (dijelaskan ) memberikan hasil sebagai berikut
Bisakah kunci asing menjadi beberapa kolom?MySQL memungkinkan kita menambahkan batasan FOREIGN KEY pada beberapa kolom dalam sebuah tabel . Syaratnya adalah setiap Foreign Key pada tabel anak harus mengacu pada tabel induk yang berbeda.
Bisakah kunci asing mereferensikan banyak kolom dari tabel induk?Tidak . Batasan kunci asing menyebutkan dengan tepat tabel dan kolom mana yang direferensikannya, dan harus mereferensikan tabel dan kolom yang sama pada setiap baris.
Bisakah kunci asing menjadi bagian dari banyak tabel?batasan FOREIGN KEY berbeda dari batasan PRIMARY KEY, Anda hanya dapat membuat satu PRIMARY KEY per setiap tabel, dengan kemampuan untuk membuat beberapa batasan FOREIGN KEY di setiap tabel . .
Berapa banyak kolom yang dapat Anda miliki sebagai kunci asing dalam tabel?Tabel dapat merujuk maksimal 253 tabel dan kolom lain sebagai kunci asing (referensi keluar). |