來自MySQL的學(xué)習(xí)筆記,寫的不對的地方大家多多指教哦
惠農(nóng)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,惠農(nóng)網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為惠農(nóng)1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的惠農(nóng)做網(wǎng)站的公司定做!
什么是外鍵?
假設(shè)有 2 個表,分別是表 A 和表 B,它們通過一個公共字段“id”發(fā)生關(guān)聯(lián)關(guān)系,我們把這個關(guān)聯(lián)關(guān)系叫做 R。如果“id”在表 A 中是主鍵,那么,表 A 就是這個關(guān)系 R 中的主表。相應(yīng)的,表 B 就是這個關(guān)系中的從表,表 B 中的“id”,就是表 B 用來引用表 A 中數(shù)據(jù)的,叫外鍵。所以,外鍵就是從表中用來引用主表中數(shù)據(jù)的那個公共字段。
語法結(jié)構(gòu):
在創(chuàng)建表時添加外鍵約束:
在修改表時定義外鍵約束:
例子1:創(chuàng)建表時添加外鍵約束
首先創(chuàng)建主表:importhead
創(chuàng)建從表:test_mysql.importdetails
查詢外鍵約束的相關(guān)信息:
查詢結(jié)果為:
例子2:修改表時定義外鍵約束
修改表時定義從表test_mysql.importdetails的外鍵約束
刪除外鍵約束使用DROP,語法結(jié)構(gòu)為:
例子:刪除從表test_mysql.importdetails的外鍵約束
在 MySQL 中,有 2 種類型的連接,分別是內(nèi)連接(INNER JOIN)和外連接(OUTER JOIN)。
在 MySQL 里面,關(guān)鍵字 JOIN、INNER JOIN、CROSS JOIN 的含義是一樣的,都表示內(nèi)連接。我們可以通過 JOIN 把兩個表關(guān)聯(lián)起來,來查詢兩個表中的數(shù)據(jù)。
例子:有一張銷售表,如下圖:
有一張會員信息表,如下圖:
通過內(nèi)連接,查詢會員的銷售記錄:
運(yùn)行語句,結(jié)果如下:
根據(jù)上面的結(jié)果,其實(shí)可以得知:內(nèi)連接查詢到結(jié)果集為兩個表的交集部分。
跟內(nèi)連接只返回符合連接條件的記錄不同的是,外連接還可以返回表中的所有記錄,它包括兩類,分別是左連接和右連接。
例子1:左外連接
如果需要查詢所有銷售記錄,則可以使用左外連接
運(yùn)行語句,結(jié)果為:
從上面的結(jié)果可以得知,LEFT JOIN左邊的表會返回全部記錄,而右邊的表只返回符合連接條件的記錄
例子2:右外連接:
運(yùn)行語句,結(jié)果為:
從上面的結(jié)果可以得知,RIGHT JOIN右邊的表會返回全部記錄,而左邊的表只返回符合連接條件的記錄
mysql增加外鍵的方法:1、在CREATE TABLE語句中,通過FOREIGN KEY關(guān)鍵字來添加外鍵;2、在ALTER TABLE語句中,通過ADD和FOREIGN KEY關(guān)鍵字來添加外鍵。
推薦課程:MySQL教程。
MySQL 外鍵約束(FOREIGN KEY)是表的一個特殊字段,經(jīng)常與主鍵約束一起使用。對于兩個具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。
外鍵用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個表的數(shù)據(jù)建立連接,約束兩個表中數(shù)據(jù)的一致性和完整性。比如,一個水果攤,只有蘋果、桃子、李子、西瓜等 4 種水果,那么,你來到水果攤要買水果就只能選擇蘋果、桃子、李子和西瓜,其它的水果都是不能購買的。
主表刪除某條記錄時,從表中與之對應(yīng)的記錄也必須有相應(yīng)的改變。一個表可以有一個或多個外鍵,外鍵可以為空值,若不為空值,則每一個外鍵的值必須等于主表中主鍵的某個值。
定義外鍵時,需要遵守下列規(guī)則:
主表必須已經(jīng)存在于數(shù)據(jù)庫中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則主表與從表是同一個表,這樣的表稱為自參照表,這種結(jié)構(gòu)稱為自參照完整性。
必須為主表定義主鍵。
主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說,只要外鍵的每個非空值出現(xiàn)在指定的主鍵中,這個外鍵的內(nèi)容就是正確的。
在主表的表名后面指定列名或列名的組合。這個列或列的組合必須是主表的主鍵或候選鍵。
外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。
外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對應(yīng)列的數(shù)據(jù)類型相同。
在創(chuàng)建表時設(shè)置外鍵約束
在 CREATE TABLE 語句中,通過 FOREIGN KEY 關(guān)鍵字來指定外鍵,具體的語法格式如下:
1
2
[CONSTRAINT 外鍵名] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES 主表名 主鍵列1 [,主鍵列2,…]
例 1
為了展現(xiàn)表與表之間的外鍵關(guān)系,本例在 test_db 數(shù)據(jù)庫中創(chuàng)建一個部門表 tb_dept1,表結(jié)構(gòu)如下表所示。
創(chuàng)建 tb_dept1 的 SQL 語句和運(yùn)行結(jié)果如下所示。
1
2
3
4
5
6
7
mysql CREATE TABLE tb_dept1
- (
- id INT(11) PRIMARY KEY,
- name VARCHAR(22) NOT NULL,
- location VARCHAR(50)
- );
Query OK, 0 rows affected (0.37 sec)
創(chuàng)建數(shù)據(jù)表 tb_emp6,并在表 tb_emp6 上創(chuàng)建外鍵約束,讓它的鍵 deptId 作為外鍵關(guān)聯(lián)到表 tb_dept1 的主鍵 id,SQL 語句和運(yùn)行結(jié)果如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql CREATE TABLE tb_emp6
- (
- id INT(11) PRIMARY KEY,
- name VARCHAR(25),
- deptId INT(11),
- salary FLOAT,
- CONSTRAINT fk_emp_dept1
- FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
- );
Query OK, 0 rows affected (0.37 sec)
mysql DESC tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field? | Type??????? | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id???? | int(11)???? | NO?? | PRI | NULL??? |?????? |
| name?? | varchar(25) | YES? |???? | NULL??? |?????? |
| deptId | int(11)???? | YES? | MUL | NULL??? |?????? |
| salary | float?????? | YES? |???? | NULL??? |?????? |
+--------+-------------+------+-----+---------+-------+
4 rows in set (1.33 sec)
以上語句執(zhí)行成功之后,在表 tb_emp6 上添加了名稱為 fk_emp_dept1 的外鍵約束,外鍵名稱為 deptId,其依賴于表 tb_dept1 的主鍵 id。
注意:從表的外鍵關(guān)聯(lián)的必須是主表的主鍵,且主鍵和外鍵的數(shù)據(jù)類型必須一致。例如,兩者都是 INT 類型,或者都是 CHAR 類型。如果不滿足這樣的要求,在創(chuàng)建從表時,就會出現(xiàn)“ERROR 1005(HY000): Can't create table”錯誤。
在修改表時添加外鍵約束
外鍵約束也可以在修改表時添加,但是添加外鍵約束的前提是:從表中外鍵列中的數(shù)據(jù)必須與主表中主鍵列中的數(shù)據(jù)一致或者是沒有數(shù)據(jù)。
在修改數(shù)據(jù)表時添加外鍵約束的語法格式如下:
閱讀剩余部分
相關(guān)閱讀
mysql日期如何轉(zhuǎn)字符串
【mysql數(shù)據(jù)庫】第三章解讀:服務(wù)器性能剖析(上)
mysql case when的用法是什么
mysql關(guān)閉后自動重啟怎么辦
mysql精講之二:dml數(shù)據(jù)操作語句
淺析mysql中concat以及group_concat的使用
mysql如何來創(chuàng)建表
mysql怎么清空數(shù)據(jù)表數(shù)據(jù)
mysql安裝配置jdbc和基礎(chǔ)學(xué)習(xí)
mysql怎么加入一個數(shù)據(jù)庫?
-- 添加外鍵約束
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)