Menyiapkan kunci asing di phpMyAdmin?

336

Saya sedang menyiapkan database menggunakan phpMyAdmin. Saya punya dua tabel ( foodan 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 idbidang adalah INT(11).

Ketika saya memilih foo_bartabel, klik tautan "tampilan relasi", dan coba atur kolom FK menjadi , database.foo.iddan database.bar.idtertulis "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.

Nathan Long
sumber

Jawaban:

366

Jika Anda ingin menggunakan phpMyAdmin untuk mengatur hubungan, Anda harus melakukan 2 hal. Pertama-tama, Anda harus mendefinisikan indeks pada kolom kunci asing di tabel referensi (jadi foo_bar.foo_id, dalam kasus Anda). Kemudian, buka tampilan relasi (dalam tabel rujukan) dan pilih kolom yang dirujuk (jadi dalam kasus Anda foo.id) dan pada pembaruan dan tindakan hapus.

Saya pikir kunci asing berguna jika Anda memiliki beberapa tabel yang ditautkan satu sama lain, khususnya, skrip penghapusan Anda akan menjadi sangat pendek jika Anda mengatur opsi referensi dengan benar.

EDIT: Pastikan kedua tabel memiliki mesin InnoDB dipilih.

rael_kid
sumber
93
Kiat: Tampilan hubungan adalah tautan kecil di bawah meja Anda, sulit bagi saya untuk menemukannya di tempat pertama
Mladen Janjetovic
14
Kecuali tautan itu tidak muncul di sana, dalam hal ini: Pastikan meja Anda bertipe InnoDB (di bawah tab Operasi di phpMyAdmin) agar hal ini tidak terjadi.
muttley91
4
@ muttley91My table saya adalah InnoDB. Saya memeriksa ulang. Tautannya masih belum muncul.
afilina
6
@afilina Dalam versi baru phpMyAdmin, terlihat di bagian atas di dalam tab "Structure", tepat di bawah baris tab yang menunjukkan "Browse", "Structure", dll.
Astitva Srivastava
226

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:

  1. Untuk kedua tabel, buka tab operasi dan ubah tipenya menjadi "INNO DB"
  2. Pastikan ID adalah kunci utama (atau setidaknya kolom yang diindeks) dari tabel PARENT.
  3. Di tabel CHILD, tentukan indeks untuk kolom PID.
  4. Saat melihat tab struktur tabel CHILD, klik tautan "tampilan relasi" tepat di atas bagian "tambahkan bidang".
  5. Anda akan diberikan tabel di mana setiap baris berhubungan dengan kolom yang diindeks di tabel CLIENT Anda. Dropdown pertama di setiap baris memungkinkan Anda memilih TABEL-> KOLOM referensi kolom yang diindeks. Di baris untuk PID, pilih PARENT-> ID dari dropdown dan klik GO.

Dengan melakukan ekspor pada tabel CHILD, Anda akan melihat batasan kunci asing telah dibuat untuk kolom PID.

menunggu
sumber
2
Wow, hal yang sangat penting untuk diketahui. Halaman ini bukan hal pertama yang saya temukan ketika mencari bantuan dengan menambahkan kunci asing, saya berharap ini lebih sering disebutkan.
user1299656
87

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.

Brett
sumber
1
Lebih baik lagi, langsung pergi ke dokumentasi sumber MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser
63

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).

masukkan deskripsi gambar di sini

Anda dapat menetapkan kunci tempa dari kotak daftar dekat dengan kunci utama (Lihat gambar di bawah). dan simpan

masukkan deskripsi gambar di sini

query SQL yang sesuai secara otomatis dihasilkan dan dieksekusi.

Nishad Up
sumber
17

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 .

  1. Pastikan Anda memiliki P_ID (ID induk pada tabel induk dan anak).
  2. Tentu saja itu sudah diisi oleh orang tua. Tidak harus pada anak dengan cara yang benar dan terakhir. Jadi misalnya P_ID # 3 (mungkin berkali-kali dalam tabel anak akan menunjuk ke P_ID asli di tabel induk).
  3. Buka tab SQL (saya menggunakan phpMyAdmin, harus serupa dengan yang lain) dan lakukan perintah ini:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. 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 ...

pengguna2060451
sumber
9

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

Shafeeq M kunjumoideen
sumber
7

InnoDB memungkinkan Anda untuk menambahkan batasan kunci asing baru ke tabel dengan menggunakan ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

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!

markus
sumber
4
Batasan kunci asing menghemat banyak usaha dan potensi kesalahan. Sebagai contoh, katakanlah saya akan menghapus pengguna dari sistem saya. Saya bisa menulis kode yang menentukan setiap tempat di database tempat data tentang pengguna itu ada, dan menyuruhnya menghapusnya. Tapi saya harus menjaga agar fungsi hapus tetap up-to-date setiap saat. Di sisi lain, jika semua data yang terkait dengan pengguna telah memiliki FK untuk ID pengguna dan diatur untuk mengalir pada penghapusan, semua kode saya katakan adalah "hapus pengguna ini" dan database akan mengurus menghapus semua yang memiliki referensi FK ke pengguna itu. Lebih bersih untuk dirawat.
Nathan Long
1
@Nathan: Itulah yang saya katakan di pos. Anda dapat mengatasinya pada level model juga. Anda dapat menerapkan penghapusan kaskade dari model.
markus
3
Anda hampir selalu menambahkan integritas referensial ke tabel database Anda. Basis data harus melindungi dirinya dari pemrograman aplikasi yang buruk. Jangan mengandalkan aplikasi Anda sendiri untuk menjaga integritas data. Tentu saja selalu ada pengecualian untuk setiap aturan, tetapi saya belum menemukan satu untuk ini.
Harv
4

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)

pouya
sumber
3

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. masukkan deskripsi gambar di sini

Langkah 2: Sekarang ketika Anda membuat tabel Anda akan melihat jenis tabelnya adalah: InnoDB

masukkan deskripsi gambar di sini

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.

masukkan deskripsi gambar di sini

Langkah 4: Sekarang buka Relation View di tabel anak yang sama dari bawah dekat Print View seperti yang ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini 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 masukkan deskripsi gambar di sini

Vinod
sumber
2

Pertama-tama atur Storage Engine sebagai InnoDB

Pertama-tama atur Storage Engine sebagai InnoDB

maka opsi tampilan relasi diaktifkan di menu struktur

maka opsi tampilan relasi diaktifkan

Sahil Ralkar
sumber
langkah pertama Anda benar tetapi bagaimana dengan selanjutnya tolong tulis semua proses langkah demi langkah.
kunal shaktawat
2

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 customeradalah tabel utama dan customer_idmerupakan kunci utama

masukkan deskripsi gambar di sini

Langkah 3 . buat tabel kunci asing dan berikan indeks

di sini kita memiliki customer_addressestabel terkait dan menyimpan alamat pelanggan, jadi di sini customer_idhubungannya dengan customertabel

kita dapat memilih indeks secara langsung saat membuat tabel seperti di bawah ini

masukkan deskripsi gambar di sini

Jika Anda lupa memberi indeks saat membuat tabel , maka Anda bisa memberikan indeks dari struktur tab tabel seperti di bawah ini.

masukkan deskripsi gambar di sini

Langkah 4 . Setelah indeks memberi ke bidang, Buka tab struktur dan klik pada Relation View seperti yang ditunjukkan pada gambar di bawah ini

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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.

Devsi Odedra
sumber
0

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

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

Dalam contoh ini, jika baris dari perusahaan dihapus, semua karyawan dengan companyid itu juga dihapus.

Vincent
sumber