Apakah mysql memiliki kunci asing?

Kunci utama berfungsi sebagai pengidentifikasi unik untuk catatan dalam tabel, sedangkan kunci asing digunakan untuk menghubungkan tabel terkait bersama. Saat mendesain satu set tabel database, penting untuk menentukan bidang mana yang akan digunakan untuk kunci primer dan asing untuk memperjelas struktur dalam tabel dan hubungan antar tabel

Tentang Kunci Asing

Dasar fundamental dari sistem basis data relasional seperti MySQL adalah kemampuannya untuk membuat hubungan antar tabel yang membentuk basis data. Dengan memungkinkan untuk dengan mudah menghubungkan catatan dalam tabel yang berbeda satu sama lain, RDBMS memungkinkan untuk menganalisis data dengan cara yang berbeda sekaligus menjaganya tetap teratur secara sistematis, dengan redundansi minimal.

Relasi ini dikelola melalui penggunaan kunci asing, pada dasarnya, bidang yang memiliki arti yang sama di semua tabel dalam relasi dan berfungsi sebagai titik kesamaan untuk menautkan record dalam tabel yang berbeda secara bersamaan. Hubungan kunci asing bisa satu-ke-satu (catatan dalam satu tabel ditautkan ke satu dan hanya satu catatan di tabel lain) atau satu-ke-banyak (catatan dalam satu tabel ditautkan ke banyak catatan di tabel lain)

GAMBAR 1 Hubungan satu-ke-satu antartabel

CATATAN

Kunci asing hanya didukung pada tabel InnoDB

Gambar 1 mengilustrasikan hubungan satu-ke-satu. layanan dan deskripsi terkaitnya, dengan hubungan antara keduanya dikelola melalui kolom ServiceID unik

Gambar 2 mengilustrasikan hubungan satu ke banyak. seorang penulis dan buku-bukunya, dengan tautan antara keduanya dipertahankan melalui kolom AuthorID yang unik

GAMBAR 2 Hubungan satu-ke-banyak antartabel

Saat membuat tabel, kunci asing dapat didefinisikan dengan cara yang hampir sama dengan kunci primer dengan menggunakan pengubah FOREIGN KEY…REFERENCES. Contoh berikut menunjukkan dengan membuat dua tabel InnoDB yang ditautkan satu sama lain dalam hubungan satu-ke-banyak oleh pengidentifikasi jenis pesawat

mysql> CREATE TABLE aircrafttype (
 -> AircraftTypeID smallint(4) unsigned NOT NULL AUTO_INCREMENT,
 -> AircraftName varchar(255) NOT NULL,
 -> PRIMARY KEY (AircraftTypeID)
 -> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.61 sec)
mysql> CREATE TABLE aircraft (
 -> AircraftID smallint(4) unsigned NOT NULL AUTO_INCREMENT,
 -> AircraftTypeID smallint(4) unsigned NOT NULL,
 -> RegNum char(6) NOT NULL,
 -> LastMaintEnd date NOT NULL,
 -> NextMaintBegin date NOT NULL,
 -> NextMaintEnd date NOT NULL,
 -> PRIMARY KEY (AircraftID),
 -> UNIQUE RegNum (RegNum),
 -> INDEX (AircraftTypeID),
 -> FOREIGN KEY (AircraftTypeID)
 -> REFERENCES aircrafttype (AircraftTypeID)
 -> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.45 sec)

Dalam contoh ini, pesawat. Bidang AircraftTypeID adalah kunci asing yang ditautkan ke jenis pesawat. Kunci utama AircraftTypeID. Perhatikan cara di mana hubungan ini ditentukan dalam pengubah FOREIGN KEY…REFERENCES. Bagian FOREIGN KEY menentukan salah satu ujung hubungan (nama bidang dalam tabel saat ini), sedangkan bagian REFERENSI menentukan ujung hubungan lainnya (nama bidang dalam tabel yang direferensikan)

TIP

Sebagai aturan umum, sebaiknya gunakan bidang bilangan bulat sebagai kunci asing daripada bidang karakter, karena ini menghasilkan kinerja yang lebih baik saat menggabungkan tabel

Setelah kunci asing disiapkan, MySQL hanya mengizinkan masuknya nilai-nilai tersebut ke dalam tipe pesawat ke dalam tabel pesawat yang juga ada di tabel tipe pesawat. Melanjutkan contoh sebelumnya, mari kita lihat cara kerjanya

mysql> INSERT INTO aircrafttype
 -> (AircraftTypeID, AircraftName)
 -> VALUES (503, 'Boeing 747');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO aircraft
 -> (AircraftID, AircraftTypeID, RegNum,
 -> LastMaintEnd, NextMaintBegin, NextMaintEnd)
 -> VALUES
 -> (3451, 503, 'ZX6488',
 -> '2007-10-01', '2008-10-23', '2008-10-31');
Query OK, 1 row affected (0.04 sec)
mysql> INSERT INTO aircraft
 -> (AircraftID, AircraftTypeID, RegNum,
 -> LastMaintEnd, NextMaintBegin, NextMaintEnd)
 -> VALUES
 -> (3452, 616, 'ZX6488',
 -> '2007-10-01', '2008-10-23', '2008-10-31');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key
constraint fails (`db1`.`aircraft`, CONSTRAINT `aircraft_ibfk_1` FOREIGN KEY
(`AircraftTypeID`) REFERENCES `aircrafttype` (`AircraftTypeID`))
_

Jadi, karena jenis pesawat dengan pengidentifikasi 616 tidak ada dalam jenis pesawat, MySQL menolak record dengan nilai tersebut untuk tabel pesawat. Dengan cara ini, batasan kunci asing dapat secara signifikan membantu menegakkan integritas data tabel dalam database dan mengurangi kemunculan nilai bidang yang "buruk" atau tidak konsisten.

Tiga batasan berikut harus diingat saat menautkan tabel dengan kunci asing

  • Semua tabel dalam relasi harus berupa tabel InnoDB. Dalam tabel non-InnoDB, pengubah FOREIGN KEY…REFERENCES diabaikan begitu saja oleh MySQL
  • Bidang yang digunakan dalam hubungan kunci asing harus diindeks di semua tabel yang direferensikan (InnoDB akan secara otomatis membuat indeks ini untuk Anda jika Anda tidak menentukannya)
  • Tipe data bidang yang disebutkan dalam hubungan kunci asing harus serupa. Ini terutama berlaku untuk tipe bilangan bulat, yang harus cocok dalam ukuran dan tanda

Yang menarik untuk dicatat adalah ini. Bahkan jika batasan kunci asing ada pada tabel, MySQL mengizinkan Anda untuk DROP tabel tanpa menimbulkan kesalahan (bahkan jika hal itu akan merusak hubungan kunci asing yang dibuat sebelumnya). Bahkan, di versi MySQL lebih awal dari 4. 0. 13, menjatuhkan tabel adalah satu-satunya cara untuk menghapus kunci asing. MySQL 4. 0. Namun, 13 dan yang lebih baru mendukung cara yang tidak terlalu drastis untuk menghapus kunci asing dari tabel, melalui perintah ALTER TABLE. Ini sebuah contoh

mysql> ALTER TABLE aircraft DROP FOREIGN KEY aircraft_ibfk_1;
Query OK, 1 row affected (0.57 sec)
Records: 1 Duplicates: 0 Warnings: 0

Untuk menghapus referensi kunci asing, gunakan klausa DROP FOREIGN KEY dengan nama internal batasan kunci asing. Nama internal ini dapat diperoleh dengan menggunakan pernyataan SHOW CREATE TABLE. Dan jika Anda bertanya-tanya mengapa Anda harus menggunakan nama kendala internal dan bukan nama bidang dalam klausa DROP FOREIGN KEY .. yah, itu pertanyaan yang bagus

Pembaruan dan Penghapusan Kunci Otomatis

Kunci asing pasti dapat memastikan integritas catatan yang baru dimasukkan. Tapi bagaimana jika record dihapus dari tabel yang disebutkan dalam klausa REFERENSI?

Jelas, catatan tersebut harus dihapus juga, atau jika tidak, Anda akan memiliki catatan yatim piatu yang mengotori database Anda. MySQL 3. 23. 50 dan yang lebih baru menyederhanakan tugas ini dengan memungkinkan Anda untuk menambahkan klausa ON DELETE ke pengubah FOREIGN KEY…REFERENCES, yang memberi tahu database apa yang harus dilakukan dengan catatan tanpa induk dalam situasi seperti itu. Inilah urutan yang menunjukkan hal ini

mysql> CREATE TABLE aircraft (
 -> AircraftID smallint(4) unsigned NOT NULL AUTO_INCREMENT,
 -> AircraftTypeID smallint(4) unsigned NOT NULL,
 -> RegNum char(6) NOT NULL,
 -> LastMaintEnd date NOT NULL,
 -> NextMaintBegin date NOT NULL,
 -> NextMaintEnd date NOT NULL,
 -> PRIMARY KEY (AircraftID),
 -> UNIQUE RegNum (RegNum),
 -> FOREIGN KEY (AircraftTypeID)
 -> REFERENCES aircrafttype (AircraftTypeID)
 -> ON DELETE CASCADE
 -> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.17 sec)
mysql> INSERT INTO aircraft
 -> (AircraftID, AircraftTypeID, RegNum,
 -> LastMaintEnd, NextMaintBegin, NextMaintEnd)
 -> VALUES
 -> (3451, 503, 'ZX6488',
 -> '2007-10-01', '2008-10-23', '2008-10-31');
Query OK, 1 row affected (0.05 sec)
mysql> DELETE FROM aircrafttype;
Query OK, 1 row affected (0.06 sec)
mysql> SELECT * FROM aircraft;
Empty set (0.01 sec)

MySQL 4. 0. 8 dan yang lebih baru juga memungkinkan Anda melakukan tindakan otomatis ini pada pembaruan dengan mengizinkan penggunaan klausa ON UPDATE, yang bekerja dengan cara yang mirip dengan klausa ON DELETE. Jadi, misalnya, menambahkan klausa ON UPDATE CASCADE ke definisi kunci asing memberi tahu MySQL bahwa ketika catatan diperbarui di tabel utama (tabel yang direferensikan untuk pemeriksaan kunci asing), semua catatan yang menggunakan nilai kunci asing di tabel saat ini harus

Tabel 1 mencantumkan empat kata kunci yang dapat mengikuti klausa ON DELETE atau ON UPDATE

TABEL 1 Tindakan yang Tersedia dalam Klausa ON DELETE dan ON UPDATE

PERINGATAN

Ketahuilah bahwa menyiapkan MySQL untuk operasi otomatis melalui aturan ON UPDATE dan ON DELETE dapat mengakibatkan kerusakan data yang serius jika hubungan kunci Anda tidak diatur dengan sempurna. Misalnya, jika Anda memiliki serangkaian tabel yang ditautkan bersama oleh hubungan kunci asing dan aturan ON DELETE CASCADE, perubahan di salah satu tabel master dapat menghasilkan rekaman, bahkan rekaman yang ditautkan hanya secara periferal ke penghapusan asli, terhapus tanpa . Untuk alasan ini, Anda harus memeriksa (dan kemudian memeriksa ulang) peraturan ini sebelum menyelesaikannya

Bagaimana saya bisa menemukan kunci asing di MySQL?

To see all FKs in your table: USE ''; SELECT i. TABLE_NAME, i. CONSTRAINT_TYPE, i. CONSTRAINT_NAME, k. .. .
To see all the tables and FKs in your schema: USE ''; SELECT i. TABLE_NAME, i. CONSTRAINT_TYPE, i. .. .
Untuk melihat semua FK di database Anda. PILIH i. TABLE_SCHEMA, i. TABLE_NAME, i

Bagaimana cara membuat kunci asing di MySQL?

Inilah sintaks untuk membuat kunci asing di MySQL. UBAH TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (nama_kunci_asing,. ) REFERENSI parent_table(nama_kolom,. ); Pada kueri di atas, nama_tabel adalah tabel tempat Anda ingin menambahkan kunci asing.

Apa kunci asing dalam database MySQL?

KUNCI ASING adalah bidang (atau kumpulan bidang) dalam satu tabel, yang merujuk ke KUNCI UTAMA di tabel lain . Tabel dengan kunci asing disebut tabel anak, dan tabel dengan kunci utama disebut tabel referensi atau induk.

Bagaimana cara mengaktifkan batasan kunci asing di MySQL?

Di MySQL, tabel InnoDB dan NDB mendukung pemeriksaan batasan kunci asing. Pemeriksaan kunci asing dikontrol oleh variabel foreign_key_checks, yang diaktifkan secara default . Biasanya, Anda membiarkan variabel ini diaktifkan selama operasi normal untuk menerapkan integritas referensial.