MySQL_Sql_打怪升級_進階篇_進階13: DDL常見資料約束
阿新 • • 發佈:2020-11-02
進階13: DDL常見資料約束
13.1 常見約束介紹
含義: 一種限制,用於限制表中的資料,為了保證表中的資料的準確和可靠性
分類:六大約束 NOT NULL: 非空,用於保證該欄位的值不能為空 ; 比如姓名、學號等 DEFAULT: 預設,用於保證該欄位有預設值; 比如性別 PRIMARY KEY: 主鍵,用於保證該欄位的值具有唯一性,並且非空; 比如學號、員工編號等 UNIQUE: 唯一,用於保證該欄位的值具有唯一性,可以為空; 比如座位號 CHECK: 檢查約束【mysql中不支援】; 比如年齡、性別 FOREIGN KEY: 外來鍵,用於限制兩個表的關係,用於保證該欄位的值必須來自於主表的關聯列的值 在從表新增外來鍵約束,用於引用主表中某列的值 比如學生表的專業編號,員工表的部門編號,員工表的工種編號
新增約束的時機:
1.建立表時
1.修改表時(資料插入之前)
約束的新增分類:
列級約束:
六大約束語法上都支援,但外來鍵約束沒有效果
表級約束:
除了非空、預設,其他的都支援
主鍵和唯一的大對比:
保證唯一性 是否允許為空 一個表中可以有多少個 是否允許組合
主鍵 √ × 至多有1個 √,但不推薦
唯一 √ √ 可以有多個 √,但不推薦
外來鍵:
1、要求在從表設定外來鍵關係 2、從表的外來鍵列的型別和主表的關聯列的型別要求一致或相容,名稱無要求 3、主表的關聯列必須是一個key(一般是主鍵或唯一) 4、插入資料時,先插入主表,再插入從表 5、刪除資料時,先刪除從表,再刪除主表
語法:
CREATE TABLE 表名(
欄位名 欄位型別 列級約束,
欄位名 欄位型別,
表級約束
);
13.2 建立表時新增約束
1.新增列級約束
語法:
直接在欄位名和型別後面追加 約束型別即可。
只支援:預設、非空、主鍵、唯一
CREATE DATABASE students; USE students; DROP TABLE stuinfo; CREATE TABLE stuinfo( id INT PRIMARY KEY, #主鍵 stuName VARCHAR(20) NOT NULL UNIQUE, #非空 gender CHAR(1) CHECK(gender='男' OR gender ='女'), #檢查 seat INT UNIQUE, #唯一 age INT DEFAULT 18, #預設約束 majorId INT REFERENCES major(id) #外來鍵 ); CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ); SELECT @@innodb_version; #檢視stuinfo中的所有索引,包括主鍵、外來鍵、唯一 SHOW INDEX FROM stuinfo;
2.新增表級約束
語法:在各個欄位的最下面【constraint 約束名】 約束型別(欄位名)
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id), #主鍵
CONSTRAINT uq UNIQUE(seat), #唯一鍵
CONSTRAINT ck CHECK(gender ='男' OR gender = '女'), #檢查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外來鍵
);
SHOW INDEX FROM stuinfo;
3.通用的寫法:★
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20),
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
13.3 修改表時新增約束
語法:
1、新增列級約束
alter table 表名 modify column 欄位名 欄位型別 新約束;
2、新增表級約束
alter table 表名 add 【constraint 約束名】 約束型別(欄位名) 【外來鍵的引用】;
示例:
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
);
DESC stuinfo;
1.新增非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
2.新增預設約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
3.新增主鍵
①列級約束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
②表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
4.新增唯一
①列級約束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
②表級約束
ALTER TABLE stuinfo ADD UNIQUE(seat);
5.新增外來鍵
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
13.4 修改表時刪除約束
1.刪除非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
2.刪除預設約束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
3.刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;
4.刪除唯一
ALTER TABLE stuinfo DROP INDEX seat;
5.刪除外來鍵
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
6.檢視結果
SHOW INDEX FROM stuinfo;