久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql中的外鍵有什么用

138次閱讀
沒有評論

共計 4303 個字符,預計需要花費 11 分鐘才能閱讀完成。

本篇內容主要講解“mysql 中的外鍵有什么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“mysql 中的外鍵有什么用”吧!

在 mysql 中,外鍵是用于建立和加強兩個表數據之間的鏈接的一列或多列,它表示一個表中的一個字段被另一個表中的一個字段引用。外鍵對相關表中的數據造成了限制,使 MySQL 能夠保持參照完整性。

本教程操作環境:windows7 系統、mysql8 版本、Dell G3 電腦。

外鍵是相對主鍵而來的。

主鍵(primary key) 能夠唯一標識表中某一行的屬性或屬性組。一個表只能有一個主鍵,但可以有多個候選索引。主鍵常常與外鍵構成參照完整性約束,防止出現數據不一致。主鍵可以保證記錄的唯一和主鍵域非空, 數據庫管理系統對于主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。

外鍵(foreign key)是用于建立和加強兩個表數據之間的鏈接的一列或多列。外鍵表示一個表中的一個字段被另一個表中的一個字段引用。外鍵對相關表中的數據造成了限制,使 MySQL 能夠保持參照完整性。

外鍵約束主要用來維護兩個表之間數據的一致性。簡言之,表的外鍵就是另一表的主鍵,外鍵將兩表聯系起來。一般情況下,要刪除一張表中的主鍵必須首先要確保其它表中的沒有相同外鍵(即該表中的主鍵沒有一個外鍵和它相關聯)。

定義外鍵時,需要遵守下列規則:

主表必須已經存在于數據庫中,或者是當前正在創建的表。如果是后一種情況,則主表與從表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。

必須為主表定義主鍵。

主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。

在主表的表名后面指定列名或列名的組合。這個列或列的組合必須是主表的主鍵或候選鍵。

外鍵中列的數目必須和主表的主鍵中列的數目相同。

外鍵中列的數據類型必須和主表主鍵中對應列的數據類型相同。

創建外鍵

MySQL 創建外鍵語法

以下語法說明了如何在 CREATE TABLE 語句中的子表中定義外鍵。

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

下面我們來更詳細的查看上面語法:

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_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_1 和 products_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 中的外鍵有什么用”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計4303字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 南宫市| 修文县| 尚志市| 讷河市| 勐海县| 邯郸市| 晋江市| 翁牛特旗| 绥中县| 黑龙江省| 盐山县| 大渡口区| 双峰县| 孟津县| 邵武市| 襄汾县| 巴里| 比如县| 登封市| 花莲市| 南丰县| 蒙自县| 洞口县| 新竹市| 保康县| 河北省| 百色市| 彰化市| 新疆| 富顺县| 岗巴县| 和硕县| 大兴区| 白山市| 海安县| 二连浩特市| 正阳县| 泰宁县| 财经| 咸丰县| 滁州市|