Dalam MySQL, kunci asing ialah satu atau lebih lajur yang digunakan untuk mewujudkan dan mengukuhkan pautan antara data dalam dua jadual Ia menunjukkan bahawa medan dalam satu jadual dirujuk oleh medan dalam jadual lain. Kunci asing meletakkan sekatan pada data dalam jadual berkaitan, membolehkan MySQL mengekalkan integriti rujukan.
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
Kunci asing adalah relatif kepada kunci primer.
Kunci utama Atribut atau kumpulan atribut yang secara unik mengenal pasti baris dalam jadual. Jadual hanya boleh mempunyai satu kunci utama, tetapi boleh mempunyai berbilang indeks calon. Kunci utama selalunya membentuk kekangan integriti rujukan dengan kunci asing untuk mengelakkan ketidakkonsistenan data. Kunci utama boleh memastikan bahawa rekod adalah unik dan medan kunci utama tidak kosong Sistem pengurusan pangkalan data secara automatik menjana indeks unik untuk kunci utama, jadi kunci utama juga merupakan indeks khas.
Kunci asing ialah satu atau lebih lajur yang digunakan untuk mewujudkan dan mengukuhkan pautan antara data dalam dua jadual. Kunci asing bermaksud bahawa medan dalam satu jadual dirujuk oleh medan dalam jadual lain. Kunci asing meletakkan sekatan pada data dalam jadual berkaitan, membolehkan MySQL mengekalkan integriti rujukan.
Kekangan kunci asing digunakan terutamanya untuk mengekalkan ketekalan data antara dua jadual. Ringkasnya, kunci asing jadual ialah kunci utama jadual lain, dan kunci asing menghubungkan dua jadual. Dalam keadaan biasa, untuk memadamkan kunci utama dalam jadual, anda mesti terlebih dahulu memastikan bahawa tiada kunci asing yang sama dalam jadual lain (iaitu, kunci utama dalam jadual tidak mempunyai kunci asing yang dikaitkan dengannya).
Apabila mentakrifkan kunci asing, anda perlu mematuhi peraturan berikut:
Jadual utama mesti sudah wujud dalam pangkalan data, atau menjadi 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.
MySQL Cipta Sintaks Kunci Asing
Sintaks berikut menggambarkan cara mencipta kunci asing dalam CREATE TABLE
pernyataan Tentukan kunci asing dalam jadual anak.
CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action
Mari kita lihat sintaks di atas dengan lebih terperinci: Klausa
CONSTRAINT
membolehkan anda mentakrifkan nama kekangan untuk kekangan kunci asing. Jika anda meninggalkannya, MySQL akan menjana nama secara automatik. Klausa FOREIGN KEY
menentukan lajur dalam jadual anak yang merujuk lajur kunci utama dalam jadual induk. Anda boleh meletakkan nama kunci asing selepas klausa FOREIGN KEY
, atau biarkan MySQL mencipta satu untuk anda. Ambil perhatian bahawa MySQL secara automatik mencipta indeks dengan nama foreign_key_name
. Klausa REFERENCES
menentukan rujukan kepada lajur dalam jadual induk dan jadual anaknya. Bilangan lajur dalam jadual anak dan induk yang dinyatakan dalam FOREIGN KEY
dan REFERENCES
mestilah sama. Klausa ON DELETE
membolehkan anda menentukan cara rekod dalam jadual anak akan melaksanakan operasi apabila rekod dalam jadual induk dipadamkan. Jika anda meninggalkan klausa ON DELETE
dan memadamkan rekod dalam jadual induk, MySQL akan menolak untuk memadamkan data yang berkaitan dalam jadual anak. Selain itu, MySQL juga menyediakan beberapa operasi supaya anda boleh menggunakan pilihan tambahan, seperti ON DELETE CASCADE , apabila memadam rekod dalam jadual induk, MySQL boleh memadam rekod dalam jadual anak yang merujuk rekod dalam induk. meja. Jika anda tidak mahu memadamkan rekod berkaitan dalam jadual anak, gunakan operasi ON DELETE SET NULL
sebaliknya. Apabila rekod dalam jadual induk dipadamkan, MySQL akan menetapkan nilai lajur kunci asing dalam jadual anak kepada NULL
, dengan syarat lajur kunci asing dalam jadual anak mesti menerima nilai NULL
. Ambil perhatian bahawa MySQL akan menolak pemadaman jika operasi ON DELETE NO ACTION
atau ON DELETE RESTRICT
digunakan. Klausa ON UPDATE
membolehkan 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 baris dalam jadual induk dikemas kini. Tindakan ON UPDATE CASCADE
membolehkan anda melakukan kemas kini tab silang dan apabila satu baris dalam jadual induk dikemas kini, tindakan ON UPDATE SET NULL
menetapkan semula nilai dalam baris dalam jadual anak kepada nilai NULL
. Tindakan ON UPDATE NO ACTION
atau UPDATE RESTRICT
menolak sebarang kemas kini. Contoh MySQL mencipta kunci asing jadual
以下示例创建一个dbdemo
数据库和两个表:categories
和products
。每个类别都有一个或多个产品,每个产品只属于一个类别。 products
表中的cat_id
字段被定义为具有UPDATE ON CASCADE
和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;
MySQL添加外键语法
要将外键添加到现有表中,请使用ALTER TABLE
语句与上述外键定义语法:
ALTER table_name ADD CONSTRAINT constraint_name FOREIGN KEY foreign_key_name(columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action;
MySQL添加外键示例
现在,我们添加一个名为vendors
的新表,并更改products
表以包含供应商ID
字段:
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;
要在products
表中添加外键,请使用以下语句:
ALTER TABLE products ADD FOREIGN KEY fk_vendor(vdr_id) REFERENCES vendors(vdr_id) ON DELETE NO ACTION ON UPDATE CASCADE;
现在,products
表有两个外键,一个是引用categories
表,另一个是引用vendors
表。
您还可以使用ALTER TABLE
语句将外键删除,如下语句:
ALTER TABLE table_name DROP FOREIGN KEY constraint_name;
在上面的声明中:
DROP FOREIGN KEY
子句之后。请注意,
constraint_name
是在创建或添加外键到表时指定的约束的名称。 如果省略它,MySQL会为您生成约束名称。
要获取生成的表的约束名称,请使用SHOW CREATE TABLE
语句,如下所示:
SHOW CREATE TABLE table_name;
例如,要查看products
表的外键,请使用以下语句:
SHOW CREATE TABLE products;
以下是语句的输出:
CREATE TABLE products ( prd_id int(11) NOT NULL AUTO_INCREMENT, prd_name varchar(355) NOT NULL, prd_price decimal(10,0) DEFAULT NULL, cat_id int(11) NOT NULL, vdr_id int(11) NOT NULL, PRIMARY KEY (prd_id), KEY fk_cat (cat_id), KEY fk_vendor(vdr_id), CONSTRAINT products_ibfk_2 FOREIGN KEY (vdr_id) REFERENCES vendors (vdr_id) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT products_ibfk_1 FOREIGN KEY (cat_id) REFERENCES categories (cat_id) ON UPDATE CASCADE ) ENGINE=InnoDB;
products
表有两个外键约束:products_ibfk_1
和products_ibfk_2
。
可以使用以下语句删除products
表的外键:
ALTER TABLE products DROP FOREIGN KEY products_ibfk_1; ALTER TABLE products DROP FOREIGN KEY products_ibfk_2;
有时,因为某种原因需要禁用外键检查(例如将CSV文件中的数据导入表中)非常有用。 如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。 但是,如果禁用外键检查,则可以按任何顺序加载导入数据。
除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束。
要禁用外键检查,请使用以下语句:
SET foreign_key_checks = 0;
当然,可以使用以下语句启用它:
SET foreign_key_checks = 1;
【相关推荐:mysql视频教程】
Atas ialah kandungan terperinci apakah kunci asing dalam mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!