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视频教程】
以上是mysql中什麼是外鍵的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP設置環境變量主要有三種方式:1.通過php.ini全局配置;2.通過Web服務器(如Apache的SetEnv或Nginx的fastcgi_param)傳遞;3.在PHP腳本中使用putenv()函數。其中,php.ini適用於全局且不常變的配置,Web服務器配置適用於需要隔離的場景,putenv()適用於臨時性的變量。持久化策略包括配置文件(如php.ini或Web服務器配置)、.env文件配合dotenv庫加載、CI/CD流程中動態注入變量。安全管理敏感信息應避免硬編碼,推薦使用.en

要讓PHP容器支持自動構建,核心在於配置持續集成(CI)流程。 1.使用Dockerfile定義PHP環境,包括基礎鏡像、擴展安裝、依賴管理和權限設置;2.配置GitLabCI等CI/CD工具,通過.gitlab-ci.yml文件定義build、test和deploy階段,實現自動構建、測試和部署;3.集成PHPUnit等測試框架,確保代碼變更後自動運行測試;4.使用Kubernetes等自動化部署策略,通過deployment.yaml文件定義部署配置;5.優化Dockerfile,採用多階段構

選擇日誌記錄方式:初期可用PHP內置error_log(),項目擴大後務必切換至Monolog等成熟庫,支持多handler和日誌級別,確保日誌含時間戳、級別、文件行號及錯誤詳情;2.設計存儲結構:小量日誌可文件存儲,大量或需分析則選數據庫,結構化數據用MySQL/PostgreSQL,半結構化/非結構化推薦Elasticsearch Kibana,同時制定備份與定期清理策略;3.開發分析界面:應具備搜索、過濾、聚合、可視化功能,可直接集成Kibana,或用PHP框架 圖表庫自研,注重界面簡潔易

MySQL用於金融系統需優化四個關鍵點:1.金融數據必須使用DECIMAL類型確保精度,時間字段使用DATETIME避免時區問題;2.索引設計要合理,避免頻繁更新字段建索引,組合索引按查詢順序排列並定期清理無用索引;3.使用事務確保一致性,控制事務粒度,避免長事務和非核心操作嵌入其中,並根據業務選擇合適隔離級別;4.對歷史數據按時間分區、歸檔冷數據並使用壓縮表,提升查詢效率並優化存儲。

本文旨在探討如何在Laravel框架中,利用EloquentORM對關聯數據進行高級條件查詢與過濾,解決在數據庫關係中實現“條件連接”的需求。文章將澄清MySQL中外鍵的實際作用,並詳細講解如何通過Eloquent的with方法結合閉包函數,對預加載的關聯模型應用特定的WHERE子句,從而靈活地篩選出符合條件的相關數據,提升數據檢索的精確性。

TooptimizeMySQLforreal-timedatafeeds,firstchoosetheInnoDBstorageenginefortransactionsandrow-levellocking,useMEMORYorROCKSDBfortemporarydata,andpartitiontime-seriesdatabytime.Second,indexstrategicallybyonlyapplyingindexestoWHERE,JOIN,orORDERBYcolumns,

是否值得將MySQL遷到雲上取決於具體使用場景。如果你的業務需要快速上線、彈性擴展和簡化運維,且能接受按需付費模式,那麼遷雲是值得的;但若你的數據庫長期穩定、對延遲敏感或受合規限制,則可能不划算。控製成本的關鍵包括選擇合適廠商與套餐、合理配置資源、利用預留實例、管理備份日誌及優化查詢性能。

TosecureMySQLeffectively,useobject-levelprivilegestolimituseraccessbasedontheirspecificneeds.Beginbyunderstandingthatobject-levelprivilegesapplytodatabases,tables,orcolumns,offeringfinercontrolthanglobalprivileges.Next,applytheprincipleofleastprivile
