Rumah  >  Artikel  >  Adakah mysql mempunyai kunci asing?

Adakah mysql mempunyai kunci asing?

百草
百草asal
2023-06-13 13:29:501606semak imbas

MySQL mempunyai kunci asing, yang digunakan terutamanya untuk mewujudkan hubungan antara jadual induk dan jadual hamba Ia boleh mewujudkan sambungan untuk data dalam dua jadual dan mengekang ketekalan dan integriti data dalam kedua-dua meja itu. Apabila rekod dipadamkan daripada jadual utama, rekod yang sepadan daripada jadual hamba juga mesti ditukar dengan sewajarnya. 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 nombor serta jenis data yang sepadan bagi lajur dalam. kunci asing mestilah sama dengan kunci utama jadual utama yang sama.

Adakah mysql mempunyai kunci asing?

Sistem pengendalian untuk tutorial ini: Sistem Windows 10, mysql versi 8.0, komputer Dell G3.

mysql mempunyai kunci asing.

KUNCI ASING MySQL (KUNCI ASING)

Kunci asing ialah medan dalam jadual tertentu yang sepadan dengan medan lain dalam 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 tempat kunci utama dalam medan yang berkaitan terletak ialah jadual utama (jadual induk), dan jadual tempat kunci asing terletak ialah jadual kedua (anak meja).

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.

Adakah mysql mempunyai kunci asing?

Kami mempunyai dua meja: 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 ibu bapa adalah sama. Kunci asing merujuk kepada kunci utama jadual, contohnya, jadual pekerja berikut:

Adakah mysql mempunyai kunci asing?

Lajur reportTo ialah kunci asing yang merujuk kepada employeeNombor sebagai lajur kunci utama jadual pekerja untuk mencerminkan hubungan antara pekerja Struktur pelaporan antara pekerja, iaitu, setiap pekerja melaporkan kepada pekerja lain, dan pekerja boleh mempunyai sifar atau lebih laporan langsung. Kami mempunyai tutorial tentang penyertaan sendiri yang boleh membantu anda menanyakan data terhadap jadual tersebut.

reportTo foreign key juga dikenali sebagai rekursif atau kunci asing 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, peraturan berikut perlu dipatuhi:

Jadual utama mesti sudah wujud dalam pangkalan data, atau 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.

Kunci utama mesti ditakrifkan 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 pada jadual

MySQL Cipta Sintaks Kunci Asing

Sintaks berikut menerangkan cara mentakrifkan kunci asing dalam subjadual dalam pernyataan CREATE TABLE.

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:

CONSTRAINT子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称。

FOREIGN KEY子句指定子表中引用父表中主键列的列。你可以把一个外键名称放在FOREIGN KEY子句之后,或者让MySQL为你创建一个名字。请注意,MySQL会自动使用foreign_key_name名称创建索引。

REFERENCES子句指定子表中的列所引用的父表及列。在规定的子表和父表的列数FOREIGN KEY和REFERENCES必须相同。

ON DELETE子句允许您定义删除父表中的记录时子表中记录的内容。如果省略ON DELETE子句并删除父表中包含子表中记录的记录,MySQL将拒绝删除。此外,MySQL还为您提供操作,以便您可以使用其他选项,例如ON DELETE CASCADE ,要求MySQL删除子表中的记录,当父表中的记录被删除时,记录将引用父表中的记录。如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL操作。MySQL会将子表中的外键列值设置为NULL删除父表中的记录时,条件是子表中的外键列必须接受NULL值。请注意,如果您使用ON DELETE NO ACTION或ON DELETE RESTRICT操作,MySQL将拒绝删除。

ON UPDATE子句使您可以指定更新父表中的行时子表中的行会发生什么。您可以省略ON UPDATE子句,以便在更新父表中的行时让MySQL拒绝对子表中行的任何更新。ON UPDATE CASCADE操作允许您执行跨表更新,并且当更新父表ON UPDATE SET NULL中的行时,操作会将子表中的行中的值重置为值NULL。ON UPDATE NO ACTION或UPDATE RESTRICT行动拒绝任何更新。

MySQL创建表外键示例

下面的示例创建一个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 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;

Adakah mysql mempunyai kunci asing?

 现在,products表有两个外键,一个引用categories表,另一个引用vendors表。

Atas ialah kandungan terperinci Adakah mysql mempunyai kunci asing?. 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