数据库数据完整性

为了保证在操作的始画数据库中的数据能够正确反映实情况,在表中会对数据做一些约束实体完整性
如:一条学生信息必须包含学号(不可缺少)

域完整性
	名字 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值