Rumah  >  Artikel  >  pangkalan data  >  apakah kunci asing dalam mysql

apakah kunci asing dalam mysql

青灯夜游
青灯夜游asal
2022-02-17 11:42:4522019semak imbas

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.

apakah kunci asing dalam mysql

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.

Buat Kunci Asing

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数据库和两个表:categoriesproducts。每个类别都有一个或多个产品,每个产品只属于一个类别。 products表中的cat_id字段被定义为具有UPDATE ON CASCADEDELETE 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表。

删除MySQL外键

您还可以使用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_1products_ibfk_2

可以使用以下语句删除products表的外键:

ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_1;

ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_2;

MySQL禁用外键检查

有时,因为某种原因需要禁用外键检查(例如将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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn