MySQL外鍵使用及說明(簡單易懂)

来源:http://www.cnblogs.com/programmer-tlh/archive/2016/08/18/5782451.html
-Advertisement-
Play Games

MySQL外鍵使用及說明 一、外鍵約束 MySQL通過外鍵約束來保證表與表之間的數據的完整性和準確性。 外鍵的使用條件: 1.兩個表必須是InnoDB表,MyISAM表暫時不支持外鍵(據說以後的版本有可能支持,但至少目前不支持); 2.外鍵列必須建立了索引,MySQL 4.1.2以後的版本在建立外鍵 ...


MySQL外鍵使用及說明

一、外鍵約束

      MySQL通過外鍵約束來保證表與表之間的數據的完整性和準確性。

 外鍵的使用條件:
    1.兩個表必須是InnoDB表,MyISAM表暫時不支持外鍵(據說以後的版本有可能支持,但至少目前不支持);
   2.外鍵列必須建立了索引,MySQL 4.1.2以後的版本在建立外鍵時會自動創建索引,但如果在較早的版本則需要顯示建立; 
   3.外鍵關係的兩個表的列必須是數據類型相似,也就是可以相互轉換類型的列,比如int和tinyint可以,而int和char則不可以;

          外鍵的好處:可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作;

外鍵的定義語法:

  [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
該語法可以在 CREATE TABLE 和 ALTER TABLE 時使用,如果不指定CONSTRAINT symbol,MYSQL會自動生成一個名字。
ON DELETE、ON UPDATE表示事件觸發限制,可設參數:
RESTRICT(限制外表中的外鍵改動)
CASCADE(跟隨外鍵改動)
SET NULL(設空值)
SET DEFAULT(設預設值)
NO ACTION(無動作,預設的)
語法詳解

簡單演示一下使用,做dage和xiaodi兩個表,大哥表是主鍵,小弟表是外鍵

建表:

 1CREATE TABLE `dage` (
 2  `id` int(11) NOT NULL auto_increment,
 3  `name` varchar(32) default '',
 4  PRIMARY KEY  (`id`))
 5  ENGINE=InnoDB DEFAULT CHARSET=latin1;
 6
 7CREATE TABLE `xiaodi` (
 8  `id` int(11) NOT NULL auto_increment,
 9  `dage_id` int(11) default NULL,
10  `name` varchar(32) default '',
11  PRIMARY KEY  (`id`),
12  KEY `dage_id` (`dage_id`),
13  CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
14) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入個大哥:

1mysql> insert into dage(name) values('銅鑼灣');
2Query OK, 1 row affected (0.01 sec)
3mysql> select * from dage;
4+----+--------+
5| id | name   |
6+----+--------+
7|  1 | 銅鑼灣 |
8+----+--------+
91 row in set (0.00 sec)

插入個小弟:

1mysql> insert into xiaodi(dage_id,name) values(1,'銅鑼灣_小弟A');
2Query OK, 1 row affected (0.02 sec)
3
4mysql> select * from xiaodi;
5+----+---------+--------------+
6| id | dage_id | name         |
7+----+---------+--------------+
8|  1 |       1 | 銅鑼灣_小弟A |
9+----+---------+--------------+

把大哥刪除:

1mysql> delete from dage where id=1;
2ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))

提示:不行呀,有約束的,大哥下麵還有小弟,可不能扔下我們不管呀

插入一個新的小弟:

1mysql> insert into xiaodi(dage_id,name) values(2,'旺角_小弟A');              
2ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))
3

提示:小子,想造反呀!你還沒大哥呢!

把外鍵約束增加事件觸發限制:

1mysql> show create table xiaodi;
 2
 3  CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
 4
 5mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1; 
 6Query OK, 1 row affected (0.04 sec)
 7Records: 1  Duplicates: 0  Warnings: 
 8mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
 9Query OK, 1 row affected (0.04 sec)
10Records: 1  Duplicates: 0  Warnings: 0

再次試著把大哥刪了:

1mysql> delete from dage where id=1;
2Query OK, 1 row affected (0.01 sec)
3
4mysql> select * from dage;
5Empty set (0.01 sec)
6
7mysql> select * from xiaodi;
8Empty set (0.00 sec)

哎呦,這回對應的小弟也沒了,沒辦法,誰讓你跟我on delete cascade(級聯限制)了呢!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> 目前隨著公司開發模式的變更,swift也顯得越發重要,相對來說,swift語言更加簡潔,嚴謹.但對於我來說,感覺swift細節的處理很繁瑣,可能是還沒適應的緣故吧.基本每寫一句代碼 ...
  • 一、項目需求: 因為產品對象用於中老年人,所以產品設計添加了APP全局字體調整大小功能。 這裡仿做QQ設置字體大小的功能。 QQ實現的效果是,滾動下麵的seekbar,當只有seekbar到達某一個刻度的時候,這時候上部分的效果展示部分會改變文字大小, 但是在拖動過程中字體不會改變。關閉此界面,就可 ...
  • alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc 註意,不要在loadV ...
  • load 方法會在載入類的時候就被調用,也就是 ios 應用啟動的時候,就會載入所有的類,就會調用每個類的 + load 方法。 在沒有對類做任何操作的情況下,+load 方法會被預設執行,並且是在 main 函數之前執行的。程式啟動之前會調用 ...
  • [className new]基本等同於[[className alloc] init]; 區別隻在於alloc分配記憶體的時候使用了zone. 這個zone是個什麼東東呢? 它是給對象分配記憶體的時候,把關聯的對象分配到一個相鄰的記憶體區域內,以便於調用時消耗很少的代價,提升了程式處理速度; 如果使用n ...
  • 1:帶中文的URL處理 2:取WebView高度 3:UIView的部分圓角問題 4:強制App直接退出 5:修改占位符顏色和大小 6:取消系統的返回手勢 7:改WebView字體/顏色 UIWebView設置字體大小,顏色,字體: UIWebView無法通過自身的屬性設置字體的一些屬性,只能通過h ...
  • 純 HTML5 APP與原生APP的差距在哪? 寫過一些純H5的APP,雖然開發起來的確很快很舒服,但和原生比起來純H5APP還是有很多問題,主要聚集在以下幾個方面: 1、動畫 動畫有很多種,比如側邊欄菜單的滑入滑出、元素的響應動畫、頁面切換之間的過場等等,在H5之下的眾多實現方法都沒有辦法達到純原 ...
  • 最近簡單的對oracle,mysql,sqlserver2005的數據分頁查詢作了研究,把各自的查詢的語句貼出來供大家學習..... (一)、 mysql的分頁查詢 mysql的分頁查詢是最簡單的,藉助關鍵字limit即可實現查詢,查詢語句通式: 如下麵的截圖,每頁顯示的記錄數為20: 查詢(1-2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...