约束分类
六大约束:
1 not null:非空,用于保证字段值不为空
2 default:默认,保证字段有默认值
3 primary key:主键,保证字段值具有唯一性,且非空
4 unique :唯一键,用于保证该字段的值具有唯一性,可以为空
5 check:检查约束(mysql中不支持)
6 foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值
添加约束的时机:
1 创建表时
2 修改表时
约束的添加分类:
1 列级约束:六大约束语法上都支持,但外键约束没有效果
2 表级约束:除了非空、默认,其他都支持
添加列级约束
CREATE TABLE stuInfo(
id INT PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL,#非空
gender CHAR(1) CHECK (gender='男' OR '女'),#检查
seat INT UNIQUE,#唯一
age INT DEFAULT 18,#默认值
majorId INT REFERENCES major(id)#外键,这种写法无效,只能在表级约束中添加
);
添加表级约束
语法:在各个字段的最后面添加 constraint 约束名 约束类型
CREATE TABLE stuInfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorId VARCHAR(20),
CONSTRAINT pk PRIMARY KEY(id),#主键
CONSTRAINT uq UNIQUE(seat),#唯一键
#constraint ck check(gender='男' or gender='女'),#检查
CONSTRAINT fk_stuInfo_major FOREIGN KEY(majorId) REFERENCES jobs(job_id)#外键
);
也可以将constraint关键字省略
CREATE TABLE stuInfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorId VARCHAR(20),
PRIMARY KEY(id),#主键
UNIQUE(seat),#唯一键
#constraint ck check(gender='男' or gender='女'),#检查
FOREIGN KEY(majorId) REFERENCES jobs(job_id)#外键
);
通用的写法:主键、唯一、不为空等在列级约束中添加,外键在表级约束中添加
CREATE TABLE stuInfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
gender CHAR(1),
seat INT UNIQUE,
age INT DEFAULT 18,
majorId VARCHAR(20),
FOREIGN KEY(majorId) REFERENCES jobs(job_id)#外键
);
主键vs唯一
保证唯一性 是否允许为空 一个表中可否有多个 是否允许组合
主键 √ × 至多有1个 可以,但不推荐
唯一 √ √ 可以有多个 可以,但不推荐