Kunci asing adalah kendala yang dapat digunakan untuk menegakkan integritas data. Itu disusun oleh kolom (atau sekumpulan kolom) dalam tabel yang disebut tabel anak, yang merujuk ke kolom (atau sekumpulan kolom) dalam tabel yang disebut tabel induk. Jika kunci asing digunakan, MariaDB melakukan beberapa pemeriksaan untuk memastikan bahwa beberapa aturan integritas selalu diterapkan. Untuk penjelasan yang lebih lengkap, lihat Database relasional. Kunci Asing Show Kunci asing hanya dapat digunakan dengan mesin penyimpanan yang mendukungnya. InnoDB default dan PBXT usang mendukung kunci asing Tabel yang dipartisi tidak boleh berisi kunci asing, dan tidak dapat direferensikan oleh kunci asing SintaksisCatatan. Sampai MariaDB 10. 4, MariaDB menerima format pintasan dengan klausa REFERENSI hanya dalam pernyataan ALTER TABLE dan CREATE TABLE, tetapi sintaks itu tidak melakukan apa-apa. Sebagai contoh CREATE TABLE b(for_key INT REFERENCES a(not_key)); MariaDB hanya mem-parsingnya tanpa mengembalikan kesalahan atau peringatan apa pun, untuk kompatibilitas dengan DBMS lain. Namun, hanya sintaks yang dijelaskan di bawah ini yang membuat kunci asing Dari MariaDB 10. 5, MariaDB akan mencoba menerapkan batasan tersebut. Lihat di bawah ini Kunci asing dibuat dengan CREATE TABLE atau ALTER TABLE. Definisi harus mengikuti sintaks ini [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT_ Klausul Kolom dalam tabel anak harus berupa indeks BTREE (bukan HASH, RTREE, atau FULLTEXT — lihat SHOW INDEX), atau bagian paling kiri dari indeks BTREE. Prefiks indeks tidak didukung (sehingga kolom TEXT dan BLOB tidak dapat digunakan sebagai kunci asing). Jika MariaDB secara otomatis membuat indeks untuk kunci asing (karena tidak ada dan tidak dibuat secara eksplisit), namanya akan menjadi [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT0 Kolom yang direferensikan dalam tabel induk harus berupa indeks atau awalan indeks Kolom kunci asing dan kolom yang direferensikan harus dari jenis yang sama, atau jenis yang serupa. Untuk tipe integer, ukuran dan tandanya juga harus sama Kolom kunci asing dan kolom yang direferensikan dapat berupa kolom PERSISTEN. Namun, klausa ON UPDATE CASCADE, ON UPDATE SET NULL, ON DELETE SET NULL tidak diperbolehkan dalam kasus ini Tabel induk dan anak harus menggunakan mesin penyimpanan yang sama, dan tidak boleh [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT1 atau tabel yang dipartisi. Mereka bisa menjadi meja yang sama KendalaJika ada kunci asing, setiap baris dalam tabel anak harus cocok dengan baris dalam tabel induk. Beberapa baris anak dapat cocok dengan baris induk yang sama. Baris anak cocok dengan baris induk jika semua nilai kunci asing identik dengan nilai baris induk di tabel induk. Namun, jika setidaknya salah satu nilai kunci asing adalah [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT2, baris tersebut tidak memiliki induk, tetapi masih diperbolehkan MariaDB melakukan pemeriksaan tertentu untuk menjamin bahwa integritas data ditegakkan
Tindakan yang diizinkan untuk [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT3 dan [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT4 adalah
Operasi hapus atau perbarui yang dipicu oleh kunci asing tidak mengaktifkan pemicu dan tidak dihitung dalam variabel dan status Batasan kunci asing dapat dinonaktifkan dengan menyetel variabel sistem server ke 0. Ini mempercepat penyisipan data dalam jumlah besar Tabel Skema Informasi CREATE TABLE author ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ) ENGINE = InnoDB; CREATE TABLE book ( id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200) NOT NULL, author_id SMALLINT UNSIGNED NOT NULL, CONSTRAINT `fk_book_author` FOREIGN KEY (author_id) REFERENCES author (id) ON DELETE CASCADE ON UPDATE RESTRICT ) ENGINE = InnoDB;_7 berisi informasi tentang kunci asing. Masing-masing kolom tercantum dalam tabel ________12______8 Tabel Skema Informasi khusus InnoDB juga berisi informasi tentang kunci asing InnoDB. Informasi kunci asing disimpan di CREATE TABLE author ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ) ENGINE = InnoDB; CREATE TABLE book ( id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200) NOT NULL, author_id SMALLINT UNSIGNED NOT NULL, CONSTRAINT `fk_book_author` FOREIGN KEY (author_id) REFERENCES author (id) ON DELETE CASCADE ON UPDATE RESTRICT ) ENGINE = InnoDB;9. Data tentang masing-masing kolom disimpan di INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)0 Cara yang paling mudah dibaca manusia untuk mendapatkan informasi tentang kunci asing tabel terkadang adalah pernyataan INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)1 KeterbatasanKunci asing memiliki batasan berikut di MariaDB
ContohMari kita lihat contohnya. Kami akan membuat tabel INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)_3 dan tabel INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)4. Kedua tabel memiliki kunci utama yang disebut INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)5. INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)_4 juga memiliki kunci asing yang disusun oleh bidang yang disebut INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)7, yang mengacu pada kunci utama INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)3. Nama batasan kunci asing adalah opsional, tetapi kami akan menentukannya karena kami ingin nama itu muncul di pesan kesalahan. INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)_9 CREATE TABLE author ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ) ENGINE = InnoDB; CREATE TABLE book ( id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200) NOT NULL, author_id SMALLINT UNSIGNED NOT NULL, CONSTRAINT `fk_book_author` FOREIGN KEY (author_id) REFERENCES author (id) ON DELETE CASCADE ON UPDATE RESTRICT ) ENGINE = InnoDB; Sekarang, jika kami mencoba memasukkan buku dengan penulis yang tidak ada, kami akan mendapatkan kesalahan INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE) Kesalahannya sangat deskriptif Sekarang, mari kita coba memasukkan dua penulis dan buku mereka dengan benar INSERT INTO author (name) VALUES ('Abdul Alhazred'); INSERT INTO book (title, author_id) VALUES ('Necronomicon', LAST_INSERT_ID()); INSERT INTO author (name) VALUES ('H.P. Lovecraft'); INSERT INTO book (title, author_id) VALUES ('The call of Cthulhu', LAST_INSERT_ID()), ('The colour out of space', LAST_INSERT_ID()); Itu berhasil Sekarang, mari kita hapus penulis kedua. Saat kami membuat kunci asing, kami menentukan INSERT INTO author (name) VALUES ('Abdul Alhazred'); INSERT INTO book (title, author_id) VALUES ('Necronomicon', LAST_INSERT_ID()); INSERT INTO author (name) VALUES ('H.P. Lovecraft'); INSERT INTO book (title, author_id) VALUES ('The call of Cthulhu', LAST_INSERT_ID()), ('The colour out of space', LAST_INSERT_ID());0. Ini akan menyebarkan penghapusan, dan membuat buku penulis yang dihapus menghilang DELETE FROM author WHERE name = 'H.P. Lovecraft'; SELECT * FROM book; +----+--------------+-----------+ | id | title | author_id | +----+--------------+-----------+ | 3 | Necronomicon | 1 | +----+--------------+-----------+ Kami juga menentukan INSERT INTO author (name) VALUES ('Abdul Alhazred'); INSERT INTO book (title, author_id) VALUES ('Necronomicon', LAST_INSERT_ID()); INSERT INTO author (name) VALUES ('H.P. Lovecraft'); INSERT INTO book (title, author_id) VALUES ('The call of Cthulhu', LAST_INSERT_ID()), ('The colour out of space', LAST_INSERT_ID());1. Ini harus mencegah kita dari memodifikasi INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE)5 penulis (kolom yang direferensikan oleh kunci asing) jika ada baris anak Bagaimana cara membuat indeks kunci asing?Foreign key dapat dibuat pada setiap kolom yang memiliki indeks unik pada tabel yang direferensikan. Indeks unik tersebut dapat dibuat dengan pernyataan CREATE INDEX ATAU indeks tersebut dapat dibuat sebagai bagian dari batasan (baik batasan UNIQUE atau PRIMARY KEY) .
Bisakah kita MEMBUAT INDEX pada kolom kunci asing di MySQL?MySQL mengharuskan kolom kunci asing diindeks ; . Informasi tentang kunci asing pada tabel InnoDB juga dapat ditemukan di tabel INNODB_FOREIGN dan INNODB_FOREIGN_COLS, di database INFORMATION_SCHEMA.
Bagaimana cara membuat indeks di MySQL?Untuk membuat indeks, gunakan perintah CREATE INDEX . BUAT INDEX nama_indeks PADA nama_tabel (nama_kolom); .
Apakah kunci asing diindeks secara default di MySQL?MySQL tidak memiliki batasan ini dan akan secara otomatis membuat indeks pada kolom yang direferensikan (atau gunakan indeks yang ada jika kolom yang direferensikan terdiri dari awal . Kunci asing secara otomatis diindeks di MySQL. stackoverflow. com/questions/304317/… |