10、约束

148 阅读4分钟

10.1 实体完整性约束

表中的一行数据代表一个实体(entity),实体完整性的作用即是标识每一行数据不重复、实体唯一。

10.1.1 主键约束

PRIMARY KEY 唯一,标识表中的一行数据,此列的值不可重复,且不能为 NULL

#为表中适用主键的列添加主键约束
CREATE TABLE subject(
    subjectId INT PRIMARY KEY,#课程编号标识每一个课程的编号唯一,且不能为 NULL
  subjectName VARCHAR(20),
  subjectHours INT
)charset=utf8;
​
INSERT INTO subject(subjectId,subjectName,subjectHours) VALUES(1,'Java',40);
INSERT INTO subject(subjectId,subjectName,subjectHours) VALUES(1,'Java',40);#error 主键 1 已存在
10.1.2 唯一约束

UNIQUE 唯一,标识表中的一行数据,不可重复,可以为 NULL

#为表中列值不允许重复的列添加唯一约束
CREATE TABLE subject(
    subjectId INT PRIMARY KEY,
  subjectName VARCHAR(20) UNIQUE,#课程名称唯一!
  subjectHours INT
)charset=utf8;
​
INSERT INTO subject(subjectId,subjectName,subjectHours) VALUES(1,'Java',40);
INSERT INTO subject(subjectId,subjectName,subjectHours) VALUES(2,'Java',40);#error 课程名称已存在
10.1.3 自动增长列

AUTO_INCREMENT 自动增长,给主键数值列添加自动增长。从 1 开始,每次加 1。不能单独使用,和主键配合。

#为表中主键列添加自动增长,避免忘记主键 ID 序号
CREATE TABLE subject(
    subjectId INT PRIMARY KEY AUTO_INCREMENT,#课程编号主键且自动增长,会从 1 开始根据添加数据的顺序依次加 1
  subjectName VARCHAR(20) UNIQUE,
  subjectHours INT
)charset=utf8;
​
INSERT INTO subject(subjectName,subjectHours) VALUES('Java',40);#课程编号自动从 1 增长
INSERT INTO subject(subjectName,subjectHours) VALUES('JavaScript',30);#第二条编号为 2

10.2 域完整性约束

限制列的单元格的数据正确性。

10.2.1 非空约束

NOT NULL 非空,此列必须有值。

#课程名称虽然添加了唯一约束,但是有 NULL 值存在的可能,要避免课程名称为NULL
CREATE TABLE subject(
    subjectId INT PRIMARY KEY AUTO_INCREMENT,
  subjectName VARCHAR(20) UNIQUE NOT NULL,
  subjectHours INT
)charset=utf8;
​
INSERT INTO subject(subjectName,subjectHours) VALUES(NULL,40);#error,课程名称约束了非空
10.2.2 默认值约束

DEFAULT 值 为列赋予默认值,当新增数据不指定值时,书写DEFAULT,以指定的默认值进行填充。

#当存储课程信息时,若课程时长没有指定值,则以默认课时 20 填充
CREATE TABLE subject(
    subjectId INT PRIMARY KEY AUTO_INCREMENT,
  subjectName VARCHAR(20) UNIQUE NOT NULL,
  subjectHours INT DEFAULT 20
)charset=utf8;
​
INSERT INTO subject(subjectName,subjectHours) VALUES('Java',DEFAULT);#课程时长以默认值 20 填充
10.2.3 引用完整性约束
#创建专业表
CREATE TABLE Speciality(
    id INT PRIMARY KEY AUTO_INCREMENT,
    SpecialName VARCHAR(20) UNIQUE NOT NULL
)CHARSET=utf8;
​
#创建课程表(课程表的SpecialId 引用专业表的 id)
CREATE TABLE subject(
    subjectId INT PRIMARY KEY AUTO_INCREMENT,
  subjectName VARCHAR(20) UNIQUE NOT NULL,
  subjectHours INT DEFAULT 20,
  specialId INT NOT NULL,
  CONSTRAINT fk_subject_specialId  FOREIGN KEY(specialId) REFERENCES Speciality(id)  #引用专业表里的 id 作为外键,新增课程信息时,约束课程所属的专业。
)charset=utf8;
​
#专业表新增数据
INSERT INTO Speciality(SpecialName) VALUES('Java');
INSERT INTO Speciality(SpecialName) VALUES('C#');
#课程信息表添加数据
INSERT INTO subject(subjectName,subjectHours) VALUES('Java',30,1);#专业 id 为 1,引用的是专业表的 Java
INSERT INTO subject(subjectName,subjectHours) VALUES('C#MVC',10,2);#专业 id 为 2,引用的是专业表的 C#

10.3 约束创建整合

创建带有约束的表。

10.3.1 创建表
列名数据类型约束说明
GradeIdINT主键、自动增长班级编号
GradeNameVARCHAR(20)唯一、非空班级名称
CREATE TABLE Grade(
    GradeId INT PRIMARY KEY AUTO_INCREMENT,
    GradeName VARCHAR(20) unique NOT NULL
)CHARSET=UTF8;
列名数据类型约束说明
student_idVARCHAR(50)主键学号
Student_nameVARCHAR(50)非空姓名
sexCHAR(2)默认填充'男'性别
borndateDATE非空生日
phoneVARCHAR(11)电话
GradeIdINT非空,外键约束:引用班级表的 gradeid。班级编号
CREATE TABLE student(
  student_id varchar(50) PRIMARY KEY,
  student_name varchar(50) NOT NULL,
  sex CHAR(2) DEFAULT '男',
  borndate date NOT NULL,
  phone varchar(11),
  gradeId int not null,
  CONSTRAINT fk_student_gradeId  FOREIGN KEY(gradeId) REFERENCES Grade(GradeId)  #引用Grade表的GradeId列的值作为外键,插入时约束学生的班级编号必须存在。
);