Saya sedang menyiapkan database menggunakan phpMyAdmin. Saya punya dua tabel ( foo
dan bar
), diindeks pada kunci utama mereka . Saya mencoba membuat tabel relasional ( foo_bar
) di antara mereka, menggunakan kunci utama mereka sebagai kunci asing.
Saya membuat tabel ini sebagai MyISAM, tetapi sejak itu mengubah ketiganya menjadi InnoDB, karena saya membaca bahwa MyISAM tidak mendukung kunci asing. Semua id
bidang adalah INT(11)
.
Ketika saya memilih foo_bar
tabel, klik tautan "tampilan relasi", dan coba atur kolom FK menjadi , database.foo.id
dan database.bar.id
tertulis "Tidak ada indeks yang ditentukan!" di sebelah setiap kolom.
Apa yang saya lewatkan?
Klarifikasi / Pembaruan
Demi kesederhanaan, saya ingin tetap menggunakan phpMyAdmin. Saat ini saya menggunakan XAMPP, yang cukup mudah untuk membuat saya fokus pada PHP / CSS / Javascript, dan ia datang dengan phpMyAdmin.
Juga, walaupun saya belum dapat mengatur kunci asing secara eksplisit, saya memiliki tabel relasional dan dapat melakukan penggabungan seperti ini:
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
Itu hanya membuat saya tidak nyaman untuk tidak memiliki FK secara eksplisit didefinisikan dalam database.
sumber
phpMyAdmin memungkinkan Anda menentukan kunci asing menggunakan tampilan "hubungan". Tetapi karena, MySQL hanya mendukung batasan asing pada tabel "INNO DB", langkah pertama adalah memastikan bahwa tabel yang Anda gunakan adalah dari jenis itu.
Untuk mengatur kunci asing sehingga kolom PID dalam tabel bernama CHILD mereferensikan kolom ID dalam tabel bernama PARENT, Anda dapat melakukan hal berikut:
Dengan melakukan ekspor pada tabel CHILD, Anda akan melihat batasan kunci asing telah dibuat untuk kolom PID.
sumber
Ini adalah ringkasan dari artikel Wikipedia. Ini menentukan berbagai jenis hubungan yang dapat Anda tentukan di PHPmyadmin. Saya meletakkannya di sini karena relevan dengan komentar @ Nathan tentang pengaturan opsi kunci asing untuk "pada pembaruan / penghapusan" tetapi terlalu besar untuk komentar - semoga membantu.
RIAM
Setiap kali baris dalam tabel master (direferensikan) dihapus (resp. Diperbarui), baris masing-masing tabel anak (referensi) dengan kolom kunci asing yang cocok akan dihapus (resp. Diperbarui) juga. Ini disebut penghapusan kaskade (pembaruan pembaruan [2]).
MEMBATASI
Nilai tidak dapat diperbarui atau dihapus ketika baris ada di tabel kunci asing yang merujuk nilai dalam tabel referensi. Demikian pula, sebuah baris tidak dapat dihapus selama ada referensi untuk itu dari tabel kunci asing.
TIDAK ADA TINDAKAN
TIDAK ADA AKSI dan PEMBATASAN sangat mirip. Perbedaan utama antara NO ACTION dan RESTRICT adalah bahwa dengan NO ACTION, pemeriksaan integritas referensial dilakukan setelah mencoba mengubah tabel. RESTRICT melakukan pengecekan sebelum mencoba menjalankan pernyataan UPDATE atau DELETE. Kedua tindakan referensial bertindak sama jika pemeriksaan integritas referensial gagal: pernyataan UPDATE atau DELETE akan menghasilkan kesalahan.
SET NULL
Nilai kunci asing di baris referensi diatur ke NULL ketika baris yang direferensikan diperbarui atau dihapus. Ini hanya mungkin jika kolom masing-masing dalam tabel referensi dapat dibatalkan. Karena semantik NULL, baris referensi dengan NULL di kolom kunci asing tidak memerlukan baris yang direferensikan.
SET STANDAR
Mirip dengan SET NULL, nilai kunci asing di baris referensi diatur ke default kolom ketika baris referensi diperbarui atau dihapus.
sumber
Di phpmyadmin, Anda dapat menetapkan kunci Asing hanya dengan GUI-nya. Klik pada tabel dan pergi ke tab Struktur. temukan Relation View pada tabel di bawah (ditunjukkan pada gambar di bawah).
Anda dapat menetapkan kunci tempa dari kotak daftar dekat dengan kunci utama (Lihat gambar di bawah). dan simpan
query SQL yang sesuai secara otomatis dihasilkan dan dieksekusi.
sumber
Bagi yang baru mengenal database .... dan perlu MENGUBAH tabel yang ada. Banyak hal yang tampaknya cukup mudah, tetapi selalu ada sesuatu ... antara A dan B.
Sebelum hal lain, lihat ini .
Buka tab SQL (saya menggunakan phpMyAdmin, harus serupa dengan yang lain) dan lakukan perintah ini:
Klik pada tabel anak, daripada struktur, akhirnya pada tampilan relasional. Selesaikan perencanaan DB Anda di sana. Ada jawaban yang bagus sebelum ini tentang kaskade, pembatasan, dll. Tentu saja itu bisa dilakukan dengan perintah ...
sumber
Foreign key berarti atribut non prime dari sebuah tabel merujuk atribut prime dari yang lain * di phpMyAdmin * pertama-tama setel kolom yang ingin Anda atur kunci asing sebagai indeks
lalu klik TAMPILAN HUBUNGAN
di sana Anda dapat menemukan opsi untuk mengatur kunci asing
sumber
InnoDB memungkinkan Anda untuk menambahkan batasan kunci asing baru ke tabel dengan menggunakan ALTER TABLE:
Di sisi lain, jika MyISAM memiliki kelebihan dibandingkan InnoDB dalam konteks Anda, mengapa Anda ingin membuat batasan kunci asing sama sekali. Anda dapat menangani ini pada tingkat model aplikasi Anda. Pastikan kolom yang ingin Anda gunakan sebagai kunci asing diindeks!
sumber
Jangan lupa bahwa kedua kolom harus memiliki tipe data yang sama.
misalnya jika satu kolom bertipe INT dan yang lainnya bertipe tinyint Anda akan mendapatkan kesalahan berikut:
Kesalahan membuat kunci asing di [kolom PID] (periksa tipe data)
sumber
Langkah 1: Anda harus menambahkan baris: default-storage-engine = InnoDB di bawah bagian [mysqld] dari file konfigurasi mysql Anda (my.cnf atau my.ini tergantung pada OS Anda) dan restart layanan mysqld.
Langkah 2: Sekarang ketika Anda membuat tabel Anda akan melihat jenis tabelnya adalah: InnoDB
Langkah 3: Buat tabel Induk dan Anak. Sekarang buka tabel Anak dan pilih kolom U ingin memiliki Kunci Asing: Pilih Kunci Indeks dari Label Tindakan seperti yang ditunjukkan di bawah ini.
Langkah 4: Sekarang buka Relation View di tabel anak yang sama dari bawah dekat Print View seperti yang ditunjukkan di bawah ini.
Langkah 5: Pilih kolom U ingin memiliki kunci Asing sebagai Pilih kolom Induk dari drop down. dbName.TableName.ColumnName
Pilih Nilai yang sesuai untuk ON DELETE dan ON UPDATE
sumber
Pertama-tama atur Storage Engine sebagai InnoDB
maka opsi tampilan relasi diaktifkan di menu struktur
sumber
Ini adalah utas lama tetapi jawabannya karena jika bermanfaat bagi siapa pun.
Langkah 1 . Mesin Penyimpanan Db Anda disetel ke InnoDB
Langkah 2 . Buat Tabel Utama
di sini
customer
adalah tabel utama dancustomer_id
merupakan kunci utamaLangkah 3 . buat tabel kunci asing dan berikan indeks
di sini kita memiliki
customer_addresses
tabel terkait dan menyimpan alamat pelanggan, jadi di sinicustomer_id
hubungannya dengancustomer
tabelkita dapat memilih indeks secara langsung saat membuat tabel seperti di bawah ini
Jika Anda lupa memberi indeks saat membuat tabel , maka Anda bisa memberikan indeks dari struktur tab tabel seperti di bawah ini.
Langkah 4 . Setelah indeks memberi ke bidang, Buka tab struktur dan klik pada Relation View seperti yang ditunjukkan pada gambar di bawah ini
Langkah 5 . Sekarang pilih ON DELETE dan ON UPATE apa yang ingin Anda lakukan, Pilih kolom dari tabel saat ini, pilih DB (SAMA DB), pilih tabel relasi dan kunci utama dari tabel itu seperti yang ditunjukkan pada gambar di bawah ini dan Simpan itu
Sekarang periksa apakah relasi berhasil, buka daftar data tabel asing dan klik pada nilai kunci asing, Anda akan mengarahkan ulang ke catatan tabel primer, kemudian relasi berhasil dibuat.
sumber
Dari dokumentasi resmi MySQL di https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
sumber
Versi phpMyAdmin yang lebih baru tidak memiliki opsi " Tampilan Relasi " lagi, dalam hal ini Anda harus menjalankan pernyataan untuk mencapai hal yang sama. Sebagai contoh
Dalam contoh ini, jika baris dari perusahaan dihapus, semua karyawan dengan companyid itu juga dihapus.
sumber