-- 添加外鍵約束
創(chuàng)新互聯(lián)建站專注于昔陽企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都商城網(wǎng)站開發(fā)。昔陽網(wǎng)站建設(shè)公司,為昔陽等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
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)
你好朋友
1.簡介
外鍵表示一個表中的一個字段被另外一個表中的字段應(yīng)用.外鍵對相關(guān)表中的數(shù)據(jù)造成了限制,使MySQL 能夠保證參照完整性.
在MySQL 中,InnoDB 存儲引擎支持外鍵.在一張表中,可以存在多個外鍵.
外鍵的創(chuàng)建可以在創(chuàng)建表的時候創(chuàng)建,也可以在創(chuàng)建表之后增加(考慮數(shù)據(jù)的完整性問題).
父表:外鍵所指向的表.
字表:相對于父表,擁有外鍵的表.
2.語法
create 語法
create table table_name(
column_1,
column_2,
....
constraint constraint_name foreign key (column_name)
references parent_table(column_name)
on delete action
on update action
) engine=InnoDB default charset utf8;
constraint 子句允許為外鍵定義一個名稱,如果不寫,MySQL 自動生成一個名稱
foreign key 子句指定子表中要應(yīng)用父表的列.注意:MySQL 會自動創(chuàng)建一個基于外鍵的索引.
references 子句指定父表中的被引用字段.foreign key 和references 指定的列數(shù)必須相同.
on delete: 定義當(dāng)父表中的記錄被刪除時,子表的記錄應(yīng)該執(zhí)行的動作.action包括:
on delete restrict:(默認),父表不能刪除一個已經(jīng)被子表引用的記錄.
on delete no action:等同與on delete restrict
on delete cascade: 級聯(lián)模式,父表刪除后,對應(yīng)子表關(guān)聯(lián)的數(shù)據(jù)也跟著被刪除
on delete set null:置空模式,父表刪除后,對應(yīng)子表關(guān)聯(lián)的外鍵值被設(shè)置為NULL,需要注意的是,如果子表的外鍵設(shè)置not null ,則不能使用這種模式,因為會相互沖突.
on update:定義父表中的記錄更新時,子表的記錄應(yīng)該執(zhí)行的動作.action 包括:
on update restrict:(默認),父表不能更新一個已經(jīng)被子表引用的記錄.
on update no action:等同與on delete restrict
on update cascade: 級聯(lián)模式,父表更新后,對應(yīng)子表關(guān)聯(lián)的數(shù)據(jù)也跟著被更新
on update set null:置空模式,父表更新后,對應(yīng)子表關(guān)聯(lián)的外鍵值被設(shè)置為NULL,需要注意的是,如果子表的外鍵設(shè)置not null ,則不能使用這種模式.
alter 語法
-- 添加外鍵
alter table table_name add constraint constraint_name
foreign key column_name
references parent_table(column_name)
on delete action
on update action
-- 刪除外鍵
alter table table_name drop constraint_name;
-- 如果沒有顯式的定義名字,可以使用如下命令獲取
show create table table_name;
3.演示
構(gòu)造兩張表categoryes 和products.每個類別有多種產(chǎn)品,而每個產(chǎn)品只屬于一個類別.
-- 設(shè)置 類別表 categoryes 和產(chǎn)品表 products
create table categoryes(
c_id int not null auto_increment,
c_name varchar(45) not null,
c_description text,
primary key (c_id)
) engine=InnoDB default charset utf8 comment '類別表';
create table products(
p_id int not null auto_increment,
p_name varchar(45) not null,
p_price decimal(8,4),
c_id int,
primary key (p_id),
constraint fk_products_categoryes
foreign key (c_id)
references categoryes(c_id)
on delete set null
on update cascade
) engine=InnoDB default charset utf8 comment '產(chǎn)品表';
在這兩張表的基礎(chǔ)上,新生成一張vendors 供應(yīng)商表,并更新products字段
-- 新生成一張表 供應(yīng)商 vendors ,并為 products 新添加字段 v_id 外鍵
-- 引用 vendors.v_id
create table vendors(
v_id int not null auto_increment,
v_name varchar(45),
primary key (v_id)
) engine=InnoDB default charset utf8 comment '供應(yīng)商';
alter table products add column v_id int not null;
alter table products add
constraint fk_products_vendors foreign key (v_id)
references vendors(v_id)
on delete no action
on update cascade;
望采納祝你好運
1.外鍵的作用,主要有兩個:
一個是讓數(shù)據(jù)庫自己通過外鍵來保證數(shù)據(jù)的完整性和一致性
一個就是能夠增加ER圖的可讀性
2.外鍵的配置
1)先創(chuàng)建一個主表,代碼如下:
#創(chuàng)建表student,并添加各種約束
create
table
student
(
id
int
primary
key
,
#主鍵約束
name
varchar(20)
,
#唯一約束
age
int
NOT
NULL,
#非空約束
sex
varchar(2)
,
address
varchar(20)
default
'重慶'
#默認約束
)
;
再通過一個外鍵,創(chuàng)建一個分?jǐn)?shù)表,這樣的話,就可以方便查詢。代碼如下:
#創(chuàng)建分?jǐn)?shù)表
create
table
score
(
id
int
primary
key
,
sid
int
,
china
int
,
history
int,
english
int,
constraint
FK_sid
foreign
key(sid)
references
student(id)
#通過外鍵創(chuàng)建鏈接
)
;
創(chuàng)建外鍵的方法有很多,其中最常見創(chuàng)建外鍵的格式是:constraint
FK_***
foreign
key(**)
references
鏈接的外表
刪除外鍵:
alter
table
drop
foreign
key
'外鍵名'.
注意:
只有在定義外鍵時,用constraint
外鍵名
foreign
key
....
方便進行外鍵的刪除
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 語句和運行結(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 語句和運行結(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ù)庫?