Perhatikan bahawa hanya enjin jadual InnoDB MySQL menyokong persatuan kunci asing, MyISAM tidak. SET FOREIGN_KEY_CHECKS = 0/1 boleh digunakan untuk menghidupkan atau mematikan kekangan kunci asing MySQL secara manual.
Faedah terbesar kekangan kunci asing MySQL ialah ia boleh membantu kami melengkapkan pengesahan ketekalan data. Menggunakan jenis kunci asing RESTRICT lalai, semakan kesahihan rujukan akan dilakukan apabila membuat, mengubah suai atau memadam rekod.
Anggapkan bahawa pangkalan data kami mengandungi dua jadual: catatan(id, id_pengarang, kandungan) dan pengarang(id, nama) Apabila melakukan operasi berikut, pangkalan data akan mencetuskan semakan kunci asing:
Apabila memasukkan data ke dalam jadual siaran, semak sama ada author_id wujud dalam jadual pengarang; >Padam Apabila memasukkan data dalam jadual pengarang, semak sama ada terdapat kunci asing yang merujuk rekod semasa dalam siaran
Sebagai sistem yang direka khusus untuk mengurus data, pangkalan data boleh memastikan integriti dengan lebih baik berbanding dengan perkhidmatan aplikasi, dan di atas Operasi ini adalah semua kerja tambahan yang disebabkan oleh memperkenalkan kunci asing, tetapi ini juga merupakan harga yang diperlukan untuk pangkalan data untuk memastikan integriti data. Kami boleh menjalankan analisis kuantitatif mudah untuk memahami kesan khusus pengenalan kunci asing terhadap prestasi, dan bukannya analisis kualitatif teori sahaja.
Tentukan kunci asing (Rujukan, rujukan) semasa membuat jadual
Dalam pernyataan CREATE TABLE, tentukan kunci asing melalui kata kunci FOREIGN KEY Format sintaks khusus adalah seperti berikut:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <主表名> 主键列1 [,主键列2,…]
Contoh:
# 部门表 tb_dept1(主表) CREATE TABLE tb_dept1 ( id INT(11) PRIMARY KEY, name VARCHAR(22) NOT NULL, location VARCHAR(50) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312; # 员工表 tb_emp6(从表),创建外键约束,让 deptId 作为外键关联到 tb_dept1 的主键 id。 CREATE TABLE tb_emp6 ( id INT(11) PRIMARY KEY, name VARCHAR(25), deptId INT(11), salary FLOAT, CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
NOTA: Kunci asing jadual kedua mesti berkaitan dengan kunci utama jadual utama, dan jenis data kunci utama dan kunci asing mestilah konsisten .
Selepas pernyataan di atas berjaya dilaksanakan, kekangan kunci asing bernama fk_emp_dept1 ditambahkan pada perwakilan tb_emp6 Nama kunci asing ialah deptId, yang bergantung pada id kunci utama jadual tb_dept1.
Lihat maklumat kekangan jadual utama
MariaDB [test_db]> select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME='tb_dept1'\G; *************************** 1. row *************************** CONSTRAINT_CATALOG: def CONSTRAINT_SCHEMA: test_db CONSTRAINT_NAME: fk_emp_dept1 TABLE_CATALOG: def TABLE_SCHEMA: test_db TABLE_NAME: tb_emp6 COLUMN_NAME: deptId ORDINAL_POSITION: 1 POSITION_IN_UNIQUE_CONSTRAINT: 1 REFERENCED_TABLE_SCHEMA: test_db REFERENCED_TABLE_NAME: tb_dept1 REFERENCED_COLUMN_NAME: id 1 row in set (0.00 sec)
Ubah suai kekangan kunci asing bagi jadual asal
Kekangan kunci asing juga boleh ditambah apabila mengubah suai jadual, tetapi menambah kekangan kunci asing ialah Premisnya ialah: data dalam lajur kunci asing dalam jadual sekunder mesti konsisten dengan data dalam lajur kunci utama dalam jadual utama atau tiada data.
ALTER TABLE <数据表名> ADD CONSTRAINT <外键名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
Contoh: Ubah suai jadual data tb_emp2, tetapkan deptId medan sebagai kunci asing dan bandingkannya dengan id kunci utama perkaitan jadual data tb_dept1.
# 创建 tb_emp2(从表) CREATE TABLE tb_emp2 ( id INT(11) PRIMARY KEY, name VARCHAR(25), deptId INT(11), salary FLOAT ) ENGINE=InnoDB DEFAULT CHARSET=gb2312; MariaDB [test_db]> desc tb_emp2; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ # 添加外键约束 ALTER TABLE tb_emp2 ADD CONSTRAINT fk_tb_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id); MariaDB [test_db]> desc tb_emp2; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | MUL | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ MariaDB [test_db]> SHOW CREATE TABLE tb_emp2\G *************************** 1. row *************************** Table: tb_emp2 Create Table: CREATE TABLE `tb_emp2` ( `id` int(11) NOT NULL, `name` varchar(25) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_tb_dept1` (`deptId`), CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312
Padamkan kekangan kunci asing
Apabila kekangan kunci asing tidak lagi diperlukan dalam jadual, ia perlu dipadamkan daripada jadual. Sebaik sahaja kunci asing dipadamkan, perkaitan antara jadual induk dan jadual hamba akan dikeluarkan.
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
Contoh: Padamkan kekangan kunci asing fk_tb_dept1 dalam jadual data tb_emp2.
rreeeeAtas ialah kandungan terperinci Bagaimana untuk melaksanakan operasi persatuan kunci asing MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!