一、數據庫約束的概述
1、約束的作用
對表中的數據進行限制,保證數據的正確性、有效性和完整性。
一個表如果添加了約束,不正確的數據將無法插入到表中。約束在創建表的時候添加比較合適。
2、約束的種類
約束名 | 約束關鍵字 |
主鍵約束 | primary key |
唯一約束 | unique |
非空約束 | not null |
外鍵約束 | foreign key |
檢查約束 | check 注:MySQL不支持 |
二、主鍵約束
1、主鍵的作用
主鍵的作用:用來唯一標識數據庫中的每一條記錄。
2、哪些字段應該作為表的主鍵
通常不用業務字段作為主鍵,單獨給每張表設計一個 id 的字段,把 id 作為主鍵。
主鍵就是給數據庫和程序使用的,不是給最終的客戶使用的,所以主鍵有沒有含義沒有關系,只有不重復,非空就行。
3、創建主鍵
-
- 主鍵關鍵字:primary key
- 主鍵的特點: ① 非空 not null; ② 唯一
- 基本語法
① 在創建表時,添加主鍵約束
create table student(
id int primary key,-- 給id添加主鍵約束
name varchar(20)
);
② 刪除主鍵
ALTER TABLE student DROP PRIMARY KEY;
③ 創建完表后,添加主鍵(兩種方式)
ALTER TABLE student MODIFY id int PRIMARY KEY;
ALTER TABLE student add primary key(字段名);
注意:
① 主鍵非空且唯一
② 一張表只能有一個字段(組)作為主鍵
③ 主鍵就是表中記錄的唯一標識
4、主鍵自增
主鍵如果讓自己添加很有可能重復,所以希望在每次插入新記錄時,數據庫自動生成主鍵字段的值。
基本語法格式:
① 創建表時,添加主鍵約束,並且完成主鍵自增長(字段類型必須是整數類型)
create table student(
id int primary key auto_increment,-- 給id添加主鍵約束
name varchar(20)
);
② 刪除自動增長
ALTER TABLE stu MODIFY id INT;
③ 創建表完后,添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
5、修改自增長的默認值起始值
默認 auto_increment 的開始值是 1,如果希望修改起始值,使用下面語法。
① 創建時指定起始值
CREATE TABLE 表名(
列名 int primary key AUTO_INCREMENT
) AUTO_INCREMENT=起始值;
② 創建好以后修改起始值
ALTER TABLE 表名 AUTO_INCREMENT=起始值;
6、delete 和 truncate 對自增長的影響
-
- delete:刪除所有記錄之后,自增長沒有影響。
- truncate:刪除以后,自增長又重新開始。
三、唯一約束
1、概念
唯一約束概念:表中的某一列不能出現重復的值,必須保證值的唯一性。
2、基本語法格式
① 創建表時,添加唯一約束
CREATE TABLE student(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一約束
);
注意:在MySQL中,唯一約束限定的列的值可以有多個 null。(null表示不確定,即不相等)
② 刪除唯一約束
ALTER TABLE student DROP INDEX phone_number;
③ 在創建表后,添加唯一約束
ALTER TABLE student MODIFY phone_number VARCHAR(20) UNIQUE;
四、非空約束
1、非空約束概念
非空約束:即數據表的某一列不能為 null。
2、基本語法格式
① 創建表時添加約束
CREATE TABLE student(
id INT,
NAME VARCHAR(20) NOT NULL -- name為非空
);
② 創建表完后,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
③ 刪除 某個字段的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
3、為某字段設置默認值
語法格式:
字段名 字段類型 DEFAULT 默認值
Demo:
1 create table student( 2 id int, 3 name varchar(20), 4 sex varchar(2) default '男'
5 ) 6
7 -- 添加一條記錄,使用默認值 8 insert into student values(6,'趙六',default) 9 -- 添加一條記錄,不適用默認值 10 insert into student values(8,'錢九','男')
擴展:如果一個字段設置了非空和為約束,該字段與主鍵有什么區別?
(1)主鍵在一個表中,只能有一個。不能出現多個主鍵。主鍵可以單列,也可以是多列
(2)自增長只能用在主鍵上。
五、外鍵約束
1、單表存儲數據的缺點
單表存儲數據可能會造成的缺點:
① 數據冗余
② 后期還會出現增刪改的問題
解決方式:使用外鍵約束
2、外鍵約束
外鍵約束概念:foreign key,讓從表中與主表主鍵對應的那一列,從而保證數據的正確性。
主表:一方,用來約束別人的表。
從表:多方,被別人約束的表。
示意圖:
3、創建約束的語法
① 創建表時增加外鍵
create table 表名(
....
外鍵列
[constraint] [外鍵名稱] foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
);
② 刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
③ 創建表之后,添加外鍵
ALTER TABLE 表名 ADD [CONSTRAINT] [外鍵名稱] FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);
4、外鍵的級聯操作
當改變主表中的主鍵時,修改失敗;在刪除主表中的記錄時,也出現刪除失敗。
級聯操作:在修改和刪除主表的主鍵時,同時更新或刪除副表的外鍵值,稱為級聯操作。
級聯操作語法:
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);
on update cascade; 表示級聯更新操作
on delete cascade; 表示級聯刪除操作
六、數據約束總結
約束名 | 關鍵字 | 說明 |
主鍵 | primary key | ① 唯一 ② 非空 |
默認 | default | 如果一列沒有值,使用默認值 |
非空 | not null | 這一列必須有值 |
唯一 | unique | 這一列不能有重復值 |
外鍵 | foreign key | 主表中主鍵列,在從表中外鍵列 |