为了保证在操作的始画数据库中的数据能够正确反映实情况,在表中会对数据做一些约束实体完整性
如:一条学生信息必须包含学号(不可缺少)
域完整性
名字 123 类型限制 取值范围限制 年龄0~150
引用完整性
不能引用不存在的引用 不能插入一个不存在班级的同学
自定义完整性
自己的规则
1,非空约束 not null
值不能为null
1,创建表的时候添加非空约束
INSERT INTO class(classNo,className)
VALUES(1,'C++');
INSERT INTO class
VALUE (2,'JAVA');
INSERT INTO class(classNo)
VALUES(3);
#班号非空所以不能跳过,必须插入值
INSERT INTO class(className)
VALUE('python')
2,如何创建之后添加或者删除非空约束
ALTER TABLE class MODIFY COLUMN classNo INT;
ALTER TABLE class MODIFY COLUMN classNo INT NOT NULL;
如果表中已经有null 设置非null属性会出问题 建议 先删除或者修改表中非空字段
2,唯一性约束 unique
值只能在表格中出现一次 可以为空 但是必须表中不能重复
1,创建是添加唯一性约束
CREATE TABLE class(
classNo INT UNIQUE,
className VARCHAR(20)
);
2,创建之后添加或者删除唯一性约束
对于一列:
ALTER TABLE class DROP MODIFY COLUMN classNo INT;
对于多列:
ALTER TABLE custom DROP INDEX `name_id`;
ALTER TABLE custom
ADD CONSTRAINT name_id UNIQUE(id,`name`);
SHOW CREATE TABLE custom;
3,主键约束
保证值 唯一 并且不能为null
CREATE TABLE admin(
id INT PRIMARY KEY,
NAME VARCHAR(10)
);
#删除表中的主键
ALTER TABLE admin DROP PRIMARY KEY;
#添加表中的主键
ALTER TABLE admin ADD PRIMARY KEY(id);
#复合主键 两个属性不能为空
#单个可以重复 组合不能一起重复
ALTER TABLE admin ADD PRIMARY KEY(id,NAME);
CREATE TABLE admin(
id INT ,
NAME VARCHAR(10),
CONSTRAINT id_name PRIMARY KEY(id,NAME)
);
4,自增约束(auto_increment)
自动增长添加的时候 如果没有赋值 那么自动赋值
DROP TABLE admin;
CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10)
)AUTO_INCREMENT=8; #从多少开始增长(可以不加)只用于整数
INSERT INTO admin(NAME)
VALUES('张三'),('李四'),('王五');
SELECT *FROM admin;
SHOW CREATE TABLE admin;
#添加或删除自动增长的变量
ALTER TABLE admin MODIFY COLUMN id INT auto_incrementl
CREATE TABLE test(
age INT CHECK(age>0andage<100)
);
INSERT INTO test
VALUES(1),(2),(3),(-1),(101);
SELECT *FROM test;
5,限制值约束(check) mysql不支持 语法上没问题
CREATE TABLE test(
age INT CHECK(age>0andage<100)
);
INSERT INTO test
VALUES(1),(2),(3),(-1),(101);
SELECT *FROM test;
CREATE TABLE teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
sex ENUM('男','女')
);
INSERT INTO teacher(sex)
VALUES('男'),('女');
SELECT *FROM teacher;
check不可用
#触发器 后面内容
#C++连接数据库 判断操作写到C++中
6,默认值约束(default) 默认值是空
CREATE TABLE teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
sex ENUM('男','女') DEFAULT '男'
);
ALTER TABLE teacher
MODIFY COLUMN sex ENUM('男','女') DEFAULT NULL;
7,外键约束(foreign key)
班级(班号,班级名) 和学生表(学生id ,学生名,班号)
学生表中班号参考班级表的班号 班号存在于班级表中才能插入
CREATE TABLE class( #父表
classNo INT PRIMARY KEY,
className VARCHAR(20) NOT NULL
);
CREATE TABLE stu( #子表
id INT PRIMARY KEY,
NAME VARCHAR(20) NOT NULL,
cNo INT, #班号 参考class中的classNo
CONSTRAINT c_id #给外键取别名 库中取唯一
FOREIGN KEY(cNo) REFERENCES class(classNo)
ON UPDATE NO ACTION #可以不同
ON DELETE CASCADE #可以不同
);
INSERT INTO class
VALUES (1,'C++'),(2,'JAVA');
INSERT INTO stu
VALUES (12,'张三',1),(13,'李四',2);
INSERT INTO stu
VALUES(15,'王五',3);
ALTER TABLE stu DROP FOREIGN KEY c_id;
ALTER TABLE stu ADD FOREIGN KEY (cNo) REFERENCES class(classNo);
#删除子表 删除一个学生,班级不会有影响
#但删除父表的内容 删除一个班级 学生会有影响 破坏了引用完整性
#对于删除父表内容 子表的三种不同的处理
##1,cascade 删除或修改父表 那么子表的内容会同步修改
UPDATE class SET classNo=3 WHERE classNo=2;
##2,no action 默认 不准动 不准删除或者修改有学生的班级
##3,set null 如果删除或修改有学生的班级 将对应班级的学生班号设置为null
## 前提是班号不可以是not null
补充:#显示表创建的格式和约束
SHOW CREATE TABLE class;