mysql資料庫外鍵約束,mysql添加外鍵約束的兩種方式重要

本文目錄一覽:

資料庫中的外鍵是什麼意思?

外鍵(FK)是用於建立和加強兩個表數據之間的鏈接的一列或多列。通過將保存表中主鍵值的一列或多列添加到另一個表中,可創建兩個表之間的鏈接。這個列就成為第二個表的外鍵。

當創建或更改表時可通過定義 FOREIGN KEY 約束來創建外鍵。

例如,資料庫 pubs 中的 titles 表與 publishers 表有鏈接,因為在書名和出版商之間存在邏輯聯繫。

titles 表中的 pub_id 列與 publishers 表中的主鍵列相對應。titles 表中的 pub_id 列是到 publishers 表的外鍵。

擴展資料:

保持數據一致性,完整性,主要目的是控制存儲在外鍵表中的數據。 使兩張表形成關聯,外鍵只能引用外表中的列的值或使用空值。

學號在成績表(表2)中是主鍵,在學生表(表1)中是外鍵。如果不使用外鍵,表1的學號欄位插了一個值(比如20140999999),但是這個值在表2中並沒有,這個時候,資料庫允許插入,並不會對插入的數據做關係檢查。

然而在設置外鍵的情況下,插入表1學號欄位的值必須要求在表1的學號欄位能找到。 同時,如果要刪除表2的某個學號欄位,必須保證表2中沒有引用該欄位值的列,否則就沒法刪除。

這就是所謂的保持數據的一致性和完整性。如右圖,如果表1還引用表2的某個學號,卻把表1中的這個學號刪了,表2就不知道這個學號對應的學生是哪個學生。

參考資料:百度百科-外鍵

MYSQL使用基礎、進階分享

MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB公司開發,屬於Oracle旗下產品,是最流行的關係型資料庫管理系統之一。

埠是3306。

表很多時,使用linux腳本,需要根據需要修改一下:

和創建一樣,可以加上 if exists

可兩篇文章:

如:

用於在已有的表中添加、刪除或修改列。

添加 ADD

默認是添加到最後,但可以指定位置。 FIRST :添加最前

AFTER 欄位名 :添加指定欄位之後

例子:

刪除 DROP

修改 MODIFY 主要修改原列的類型或約束條件 同樣可以用 FIRST 和 AFTER 欄位名 ,代表的是修改到哪裡。

修改欄位名 CHANGE

可以把表2的數據複製到表1中,但 不能複製約束性條件 。

單行

多行,注意 只有一個VALUES :

不寫 (行1, 行2…) 這一部分的話,默認一一對應

除了以上方法外,還可以用SET為每一行附上相應的值。

假如沒有篩選的話,就給全部都修改了。可以用 WHERE 篩選。

假如 沒有篩選的話,就給全部刪除了 。相當於清空。

清空

先把表刪除,然後再建一個。與 DELETE FROM 相比, TRUNCATE 的效率更快,因為 DELETE FROM 是把記錄逐條刪除的。

查詢執行的順序

FROM — WHERE — SELECT — GROUP BY — HAVING — ORDER BY — LIMIT

注意

當數據很大,上百萬的時候,使用LIMIT … OFFSET ..的方式進行分頁十分浪費資源且耗時長。最好是結合WHERE使用,如:

REGEXP 使用正則表達進行匹配。 查詢時,需要搭配WHERE或HAVING使用 。

兩個表之間有交集且要用到兩個表的數據時,可以使用內連接查詢。

LEFT JOIN 關鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。

用法:

RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。 把LEFT JOIN的表1、表2調換順序,就是REGHT JOIN 。

FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行. 相當於結合了 LEFT JOIN 和 RIGHT JOIN 的結果。

但 MySQL中不支持 FULL OUTER JOIN 。

即SELECT嵌套。

IN 一個查詢結果作為另一個查詢的條件。 如:

EXISTS 用於判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時執行。 如:

索引的本質是一種排好序的數據結構。利用索引可以提高查詢速度。

常見的索引有:

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

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

對已有的兩個表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b

為子表添加一個欄位,當做外鍵

為子表添加外鍵約束條件

假如刪除記錄報錯: [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (…)

這是因為MySQL中設置了foreign key關聯,造成無法更新或刪除數據。可以通過設置 FOREIGN_KEY_CHECKS 變數來避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數據 第三步:啟動外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;

使用 UNION 來組合兩個查詢,如果第一個查詢返回 M 行,第二個查詢返回 N 行,那麼組合查詢的結果一般為 M+N 行。

每個查詢必須包含相同的列、表達式和聚集函數。

默認會去除相同行,如果需要 保留 相同行,使用 UNION ALL 。

只能包含一個 ORDER BY 子句,並且必須位於語句的最後 。

內置函數很多, 見: MySQL 函數

我們一般使用 START TRANSACTION 或 BEGIN 開啟事務, COMMIT 提交事務中的命令, SAVEPOINT : 相當於設置一個還原點, ROLLBACK TO : 回滾到某個還原點下

一般的使用格式如下:

開啟事務時, 默認加鎖

根據類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。

根據粒度劃分又分表鎖和行鎖。表鎖由資料庫伺服器實現,行鎖由存儲引擎實現。

除此之外,我們可以顯示加鎖

加鎖時, 如果沒有索引,會鎖表,如果加了索引,就會鎖行

InnoDB默認支持行鎖,獲取鎖是分步的,並不是一次性獲取所有的鎖,因此在鎖競爭的時候就會出現死鎖的情況

解決方法:

即ACID特性:

由於並發事務會引發上面這些問題, 我們可以設置事務的隔離級別解決上面的問題.

MySQL的默認隔離級別(可重複讀)

查看當前會話隔離級別

方式1

方式2

設置隔離級別

主從集群的示意圖如下:

主要涉及三個線程: binlog 線程、 I/O 線程和 SQL 線程。

同步流程:

由於MySQL主從集群只會從主節點同步到從節點, 不會反過來同步, 所以需要讀寫分離

讀寫分離需要在業務層面實現 , 寫數據只能在主節點上完成, 而讀數據可以在主節點或從節點上完成

索引是幫助MySQL高效獲取數據的排好序的數據結構

MySQL的索引有

推薦兩個在線工具:

簡單來說, B樹是在紅黑樹(一個平衡二叉樹)的基礎上將一個節點存放多個值, 實現的, 降低了樹的高度, 每個節點都存放索引及對應數據指針, 同一層的節點是遞增的

而B+樹在B樹的基礎上進行優化, 非葉子節點存放 子節點的開始的索引, 葉子節點存放索引和數據的指針, 且葉子節點之間有雙向的指針

如下示意圖:

不同的引擎, 主鍵索引存放的數據也不一樣, 比如常見的 MyISAM 和 InnoDB

MyISAM 的B+樹葉子節點存放表數據的指針, InnoDB 的B+樹葉子節點存放處主鍵外的數據

其他的:

即多個列組成一個索引, 語法:

由於聯合索引的B+樹的結構, 根據列建立, 所以我們的查找條件也要根據索引列的順序( where column1=x, column2=y,columnN… ), 否則會全表掃描

如果你對列進行了 (+,-,*,/,!) , 那麼都將不會走索引。

OR 引起的索引失效

OR 導致索引是在特定情況下的,並不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個欄位,那麼索引 不會失效 , 反之索引失效 。

這個我相信大家都明白,模糊搜索如果你前綴也進行模糊搜索,那麼不會走索引。

這兩種用法,也將使索引失效。另 IN 會走索引,但是當IN的取值範圍較大時會導致索引失效,走全表掃描, 見: MySQL中使用IN會不會走索引

不走索引。

走索引。

所以設計表的時候, 建議不可為空, 而是將默認值設置為 “” ( NOT NULL DEFAULT “” )

mysql在建表時添加外鍵約束

— 添加外鍵約束

CREATE TABLE stu(

sid INT PRIMARY KEY,

NAME VARCHAR(50) NOT NULL

);

— 添加外鍵約束方式一

CREATE TABLE score1(

score DOUBLE,

sid INT,

CONSTRAINT fk_stu_score1_sid FOREIGN KEY(sid) REFERENCES stu(sid)

);

— 添加外鍵約束方式二(若表已存在,可用這種)

CREATE TABLE score1(

score DOUBLE,

sid INT

);

ALTER TABLE score1 ADD CONSTRAINT fk_sid FOREIGN KEY(sid) REFERENCES stu(sid)

如何在MySQL中設置外鍵約束以及外鍵的作用

1.外鍵的作用,主要有兩個:

一個是讓資料庫自己通過外鍵來保證數據的完整性和一致性

一個就是能夠增加ER圖的可讀性

2.外鍵的配置

1)先創建一個主表,代碼如下:

#創建表student,並添加各種約束

create

table

student

(

id

int

primary

key

,

#主鍵約束

name

varchar(20)

,

#唯一約束

age

int

NOT

NULL,

#非空約束

sex

varchar(2)

,

address

varchar(20)

default

‘重慶’

#默認約束

)

;

再通過一個外鍵,創建一個分數表,這樣的話,就可以方便查詢。代碼如下:

#創建分數表

create

table

score

(

id

int

primary

key

,

sid

int

,

china

int

,

history

int,

english

int,

constraint

FK_sid

foreign

key(sid)

references

student(id)

#通過外鍵創建鏈接

)

;

創建外鍵的方法有很多,其中最常見創建外鍵的格式是:constraint

FK_***

foreign

key(**)

references

鏈接的外表

刪除外鍵:

alter

table

drop

foreign

key

‘外鍵名’.

注意:

只有在定義外鍵時,用constraint

外鍵名

foreign

key

….

方便進行外鍵的刪除

mysql 外鍵約束 是什麼意思?

舉個例子說吧,如果表A的主關鍵字是表B中的欄位,則該欄位稱為表B的外鍵,表A稱為主表,表B稱為從表。外鍵約束就是用來實現參照完整性的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/288864.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 03:01
下一篇 2024-12-24 03:01

相關推薦

  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • 資料庫第三範式會有刪除插入異常

    如果沒有正確設計資料庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係資料庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網路應用中流…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入資料庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的資料庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • 如何計算兩種股票收益率的協方差

    協方差是用來衡量兩個變數間線性關係強度的方法,它顯示了兩個變數如何一起變化。在股票市場中,我們常常需要計算兩種股票之間的協方差,以衡量它們的投資回報之間的關係。本文將從多個方面詳細…

    編程 2025-04-28
  • Python在線編輯器的優勢與實現方式

    Python在線編輯器是Python語言愛好者的重要工具之一,它可以讓用戶方便快捷的在線編碼、調試和分享代碼,無需在本地安裝Python環境。本文將從多個方面對Python在線編輯…

    編程 2025-04-28
  • Java表單提交方式

    Java表單提交有兩種方式,分別是get和post。下面我們將從以下幾個方面詳細闡述這兩種方式。 一、get方式 1、什麼是get方式 在get方式下,表單的數據會以查詢字元串的形…

    編程 2025-04-27
  • Think-ORM數據模型及資料庫核心操作

    本文主要介紹Think-ORM數據模型建立和資料庫核心操作。 一、模型定義 Think-ORM是一個開源的ORM框架,用於簡化在PHP應用中(特別是ThinkPHP)與關係資料庫之…

    編程 2025-04-27

發表回復

登錄後才能評論