#常見約束
/*
含義:一種限制,用於限制表中的數據,為了保證表中的數據的准確和可靠性
分類:六大約束
NOT NULL:非空,用於保證該字段的值不能為空
比如姓名、學號等
DEFAULT:默認,用於保證該字段有默認值
比如性別
PRIMARY KEY:主鍵,用於保證該字段的值具有唯一性,並且非空
比如學號、員工編號等
UNIQUE:唯一,用於保證該字段的值具有唯一性,可以為空
比如座位號
CHECK:檢查約束【mysql中不支持】
比如年齡、性別
FOREIGN KEY:外鍵,用於限制兩個表的關系,用於保證該字段的值必須來自於主表的關聯列的值
在從表添加外鍵約束,用於引用主表中某列的值
比如學生表的專業編號,員工表的部門編號,員工表的工種編號
添加約束的時機:
1.創建表時
2.修改表時
約束的添加分類:
列級約束:
六大約束語法上都支持,但外鍵約束沒有效果
表級約束:
除了非空、默認,其他的都支持
主鍵和唯一的大對比:
保證唯一性 是否允許為空 一個表中可以有多少個 是否允許組合
主鍵 √ × 至多有1個 √,但不推薦
唯一 √ √ 可以有多個 √,但不推薦
外鍵:
1、要求在從表設置外鍵關系
2、從表的外鍵列的類型和主表的關聯列的類型要求一致或兼容,名稱無要求
3、主表的關聯列必須是一個key(一般是主鍵或唯一)
4、插入數據時,先插入主表,再插入從表
刪除數據時,先刪除從表,再刪除主表
*/
CREATE TABLE 表名(
字段名 字段類型 列級約束,
字段名 字段類型,
表級約束
)
CREATE DATABASE students;
#一、創建表時添加約束
#1.添加列級約束
/*
語法:
直接在字段名和類型后面追加 約束類型即可。
只支持:默認、非空、主鍵、唯一
*/
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)
);
#查看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;
#通用的寫法:★
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)
);
#二、修改表時添加約束
/*
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);
#三、修改表時刪除約束
#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;
SHOW INDEX FROM stuinfo;
