Rumah > Artikel > pangkalan data > mysql tidak menyokong kunci asing
mysql menyokong kunci asing. Dalam MySQL, kunci asing digunakan terutamanya untuk mewujudkan hubungan antara jadual induk dan jadual hamba Mereka boleh mewujudkan sambungan untuk data dalam dua jadual dan mengekang ketekalan dan integriti data dalam dua jadual jadual memadam rekod, Rekod yang sepadan daripada jadual juga mesti diubah dengan sewajarnya. Jadual boleh mempunyai satu atau lebih kunci asing, dan kunci asing boleh menjadi nilai nol Jika ia bukan nilai nol, nilai setiap kunci asing mestilah sama dengan nilai tertentu kunci utama dalam jadual utama; dan bilangan lajur dalam kunci asing dan Jenis data yang sepadan mestilah sama dengan kunci utama jadual utama.
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
mysql menyokong kunci asing.
KUNCI ASING MySQL
Kunci asing ialah medan dalam jadual tertentu yang sepadan dengan medan lain dalam medan jadual lain. Kunci asing menetapkan kekangan pada data dalam jadual berkaitan, yang membolehkan MySQL mengekalkan integriti rujukan.
Kunci asing digunakan untuk mewujudkan hubungan antara jadual induk dan jadual hamba, mewujudkan sambungan untuk data dalam dua jadual, dan mengekang ketekalan dan integriti data dalam dua jadual.
Untuk dua jadual dengan perhubungan yang berkaitan, jadual di mana kunci utama dalam medan yang berkaitan terletak ialah jadual utama (jadual induk) dan jadual di mana kunci asing terletak adalah yang kedua. meja (meja kanak-kanak).
Apabila rekod dipadamkan daripada jadual utama, rekod yang sepadan daripada jadual juga mesti ditukar sewajarnya. Sesuatu jadual boleh mempunyai satu atau lebih kunci asing, dan kunci asing boleh menjadi batal Jika ia tidak batal, nilai setiap kunci asing mestilah sama dengan nilai tertentu kunci utama dalam jadual utama.
Mari kita lihat rajah pangkalan data berikut daripada pangkalan data sampel.
Kami mempunyai dua jadual: pelanggan dan pesanan Setiap pelanggan mempunyai sifar atau lebih pesanan, dan setiap pesanan hanya boleh dimiliki oleh seorang pelanggan. Hubungan antara jadual pelanggan dan jadual pesanan adalah satu-ke-banyak, dengan pesanan ditubuhkan oleh kunci asing dalam jadual yang ditentukan oleh medan customerNumber. Medan customerNumber dalam jadual pelanggan berkaitan dengan medan kunci utama customerNumber dalam jadual pesanan.
Jadual pelanggan dipanggil jadual induk atau jadual rujukan, dan jadual pesanan dipanggil jadual anak atau jadual rujukan.
Kunci asing boleh menjadi lajur atau set lajur. Lajur dalam jadual anak biasanya merujuk kepada lajur kunci utama dalam jadual induk.
Sesuatu jadual boleh mempunyai berbilang kunci asing dan setiap kunci asing dalam jadual anak boleh merujuk jadual induk yang berbeza.
Baris dalam jadual anak mesti mengandungi nilai yang wujud dalam jadual induk, contohnya, setiap rekod pesanan dalam jadual pesanan mesti mempunyai nilai yang wujud dalam nombor pelanggan jadual pelanggan. Oleh itu, berbilang pesanan boleh merujuk pelanggan yang sama, dan hubungan ini dipanggil satu (pelanggan) kepada banyak (pesanan) atau satu-ke-banyak.
Kadangkala, meja anak dan meja induk adalah sama. Kunci asing merujuk kepada kunci utama jadual, contohnya, jadual pekerja berikut:
Lajur reportTo ialah kunci asing yang merujuk kepada employeeNombor sebagai lajur kunci utama jadual pekerja untuk menggambarkan hubungan antara pekerja Struktur pelaporan di mana setiap pekerja melaporkan kepada pekerja lain, dan pekerja boleh mempunyai sifar atau lebih laporan langsung. Kami mempunyai tutorial tentang sambung sendiri yang boleh membantu anda menanyakan data terhadap jadual tersebut.
laporkan kepada kunci asing juga dikenali sebagai kunci asing rekursif atau rujukan sendiri.
Kunci asing menguatkuasakan integriti rujukan, membantu anda mengekalkan konsistensi dan integriti data anda secara automatik. Sebagai contoh, anda tidak boleh membuat pesanan untuk pelanggan yang tidak wujud.
Selain itu, anda boleh menyediakan lata pada operasi pemadaman kunci asing customerNumber supaya apabila pelanggan dipadamkan dalam jadual pelanggan, semua pesanan yang dikaitkan dengan pelanggan juga dipadamkan. Ini menjimatkan masa dan usaha menggunakan berbilang kenyataan DELETE atau DELETE JOIN kenyataan.
Sama seperti padam, anda juga boleh mentakrifkan lata untuk kunci asing customerNumber pada operasi kemas kini untuk melaksanakan kemas kini merentas jadual tanpa menggunakan berbilang penyataan KEMASKINI atau KEMASKINI kenyataan JOIN.
Nota: Dalam MySQL, enjin storan InnoDB menyokong kunci asing, jadi anda mesti mencipta jadual InnoDB untuk menggunakan kekangan kunci asing.
Apabila mysql mentakrifkan kunci asing, anda perlu mematuhi peraturan berikut:
Jadual utama mesti sudah wujud dalam pangkalan data, atau mesti semasa Jadual sedang dibuat. Jika ia adalah kes kedua, jadual induk dan jadual hamba adalah jadual yang sama dipanggil jadual rujukan sendiri, dan struktur ini dipanggil integriti rujukan sendiri.
Mesti menentukan kunci utama untuk jadual utama.
Kunci utama tidak boleh mengandungi nilai nol, tetapi nilai null dibenarkan dalam kunci asing. Iaitu, selagi setiap nilai bukan nol kunci asing muncul dalam kunci utama yang ditentukan, kandungan kunci asing adalah betul.
Nyatakan nama lajur atau gabungan nama lajur selepas nama jadual jadual utama. Lajur atau gabungan lajur ini mestilah kunci utama atau kunci calon jadual utama.
Bilangan lajur dalam kunci asing mestilah sama dengan bilangan lajur dalam kunci utama jadual utama.
Jenis data lajur dalam kunci asing mestilah sama dengan jenis data lajur yang sepadan dalam kunci utama jadual utama.
Buat kunci asing untuk jadual
MySQL Cipta Sintaks Kunci Asing
Sintaks berikut menerangkan cara untuk mencipta kunci asing dalam CREATE TABLE Kekunci asing ditakrifkan dalam jadual anak dalam pernyataan.
CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action
Mari kita pelajari sintaks dengan lebih terperinci:
Klausa CONSTRAINT membolehkan anda mentakrifkan nama kekangan untuk kekangan kunci asing. Jika anda meninggalkannya, MySQL akan menjana nama secara automatik.
Klausa KUNCI ASING menentukan lajur dalam jadual anak yang merujuk kepada lajur kunci utama dalam jadual induk. Anda boleh meletakkan nama kunci asing selepas klausa KUNCI ASING, atau biarkan MySQL mencipta nama untuk anda. Ambil perhatian bahawa MySQL secara automatik mencipta indeks menggunakan nama foreign_key_name. Klausa
RUJUKAN menentukan jadual induk dan lajur yang dirujuk oleh lajur dalam jadual anak. Bilangan lajur dalam jadual anak dan jadual induk yang ditentukan KUNCI DAN RUJUKAN ASING mestilah sama.
Klausa PADAM membolehkan anda mentakrifkan perkara yang berlaku kepada rekod dalam jadual anak apabila rekod dalam jadual induk dipadamkan. Jika anda meninggalkan klausa ON DELETE dan memadam rekod dalam jadual induk yang mengandungi rekod dalam jadual anak, MySQL akan menolak untuk memadam. Selain itu, MySQL juga memberi anda tindakan supaya anda boleh menggunakan pilihan tambahan seperti ON DELETE CASCADE , yang meminta MySQL memadamkan rekod dalam jadual anak Apabila rekod dalam jadual induk dipadamkan, rekod akan merujuk rekod itu meja induk. Jika anda tidak mahu memadamkan rekod berkaitan dalam jadual anak, gunakan operasi ON DELETE SET NULL sebagai gantinya. MySQL akan menetapkan nilai lajur kunci asing dalam jadual anak kepada NULL apabila memadam rekod dalam jadual induk, syaratnya lajur kunci asing dalam jadual anak mesti menerima nilai NULL. Ambil perhatian bahawa MySQL akan menolak pemadaman jika anda menggunakan operasi ON DELETE NO ACTION atau ON DELETE RESTRICT.
Klausa ON UPDATE membenarkan anda menentukan perkara yang berlaku kepada baris dalam jadual anak apabila baris dalam jadual induk dikemas kini. Anda boleh meninggalkan klausa ON UPDATE untuk meminta MySQL menolak sebarang kemas kini pada baris dalam jadual anak apabila mengemas kini baris dalam jadual induk. Operasi ON UPDATE CASCADE membolehkan anda melakukan kemas kini silang jadual, dan apabila satu baris dalam jadual induk dikemas kini PADA SET KEMASKINI NULL, operasi menetapkan semula nilai dalam baris dalam jadual anak kepada nilai NULL. ON UPDATE NO ACTION or UPDATE HAD tindakan untuk menolak sebarang kemas kini.
MySQL Create Table Foreign Key Contoh
Contoh berikut mencipta pangkalan data dbdemo dan dua jadual: kategori dan produk Setiap kategori mempunyai Satu atau lebih banyak produk dan setiap produk tergolong dalam satu kategori sahaja. Medan cat_id dalam jadual produk ditakrifkan sebagai kunci asing dengan operasi KEMASKINI ON CASCADE dan DELETE ON RESTRICT.
CREATE DATABASE IF NOT EXISTS dbdemo; USE dbdemo; CREATE TABLE categories( cat_id int not null auto_increment primary key, cat_name varchar(255) not null, cat_description text ) ENGINE=InnoDB; CREATE TABLE products( prd_id int not null auto_increment primary key, prd_name varchar(355) not null, prd_price decimal, cat_id int not null, FOREIGN KEY fk_cat(cat_id) REFERENCES categories(cat_id) ON UPDATE CASCADE ON DELETE RESTRICT )ENGINE=InnoDB;
Tambah kunci asing pada jadual
MySQL tambahkan sintaks kunci asing
Kepada tambah kunci asing pada jadual sedia ada, gunakan pernyataan ALTER TABLE dengan sintaks definisi kunci asing di atas:
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY foreign_key_name(columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action;
MySQL Add Foreign Key Contoh
Sekarang, mari tambah jadual baharu yang dipanggil vendor dan tukar jadual produk untuk memasukkan medan ID vendor:
USE dbdemo; CREATE TABLE vendors( vdr_id int not null auto_increment primary key, vdr_name varchar(255) )ENGINE=InnoDB; ALTER TABLE products ADD COLUMN vdr_id int not null AFTER cat_id;
Untuk menambah produk kunci asing pada jadual, gunakan pernyataan berikut:
ALTER TABLE products ADD FOREIGN KEY fk_vendor(vdr_id) REFERENCES vendors(vdr_id) ON DELETE NO ACTION ON UPDATE CASCADE;
Kini, jadual produk mempunyai dua kunci asing, satu merujuk kepada jadual kategori dan satu lagi merujuk kepada jadual vendor.
[Cadangan berkaitan: tutorial video mysql]
Atas ialah kandungan terperinci mysql tidak menyokong kunci asing. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!