# 常見約束
/*
引入:
create table 表名(
字段名 字段類型 列級約束,
字段名 字段類型,
表級約束
)
含義:一種限制,用於限制表中的數據,爲了保證表中的數據的準確和可靠性
分類:六大約束
not null:非空,用於保證該字段的值不能爲空
default:默認,用於保證該字段有默認值
primary key:主鍵,用於保證該字段的值具有唯一性,並且非空
unique:唯一,用於保證該字段的值具有唯一性,可以爲空
check:檢查約束【mysql中不支持】
foreign key:外鍵,用於限制兩個表的關係,用於保證該字段的值必須來自於主表的關聯列的值
添加約束的時機:
1.創建表時
2.修改表時
約束的添加分類:
列級約束
六大約束語法上都支持,但外鍵約束沒有效果
表級約束
除了非空、默認,其他都支持
主鍵和唯一的對比:
保證唯一性 是否爲空 一個表中可又有多少個 是否允許組合
主鍵 √ × 至多一個 √ ,但不推薦
唯一 √ √(低版本null也只能唯一) 可以有多個 √ ,但不推薦
外鍵:
1.要求在從表設置外鍵關係
2.從表的外鍵列的類型和主表的關聯列的類型要求一致或兼容,命名無要求
3.主表的關聯列必須是一個key(一般是主鍵或唯一)
4.插入數據時,先插入主表,再插入從表
刪除數據時,先刪除從表,再刪除主表
insert into major values(1,'java');
insert into major values(2,'h5');
insert into stuinfo values(1,'join','男',null,19,1);
insert into stuinfo values(2,'lily','男',null,18,1)
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo(
id int,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
major_id INT,
seat2 INT,
PRIMARY KEY(id,stuName),
UNIQUE(seat,seat2),
CHECK(gender='男' OR gender='女'), # 檢查
FOREIGN KEY(major_id) REFERENCES major(id)
);
*/
# 一、創建表時添加約束
#1.添加列級約束
/*
語法:
直接在字段名和類型後面追加 約束類型 即可
只支持:默認、非空、主鍵、唯一
*/
CREATE DATABASE IF NOT EXISTS students;
USE students
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, # 默認約束
major_id INT REFERENCES major(id) # 外鍵
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
DESC stuinfo;
# 查看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,
major_id INT,
CONSTRAINT pk PRIMARY KEY(id), # 主鍵
CONSTRAINT uq UNIQUE(seat), # 唯一
CONSTRAINT ck CHECK(gender='男' OR gender='女'), # 檢查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(major_id) REFERENCES major(id) # 外鍵
);
# 通用的寫法:
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
major_id INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(major_id) 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,
major_id INT
);
# 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(major_id) 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;
MySQL常見約束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.