SQL语言:完整性约束

完整性约束
数据完整性是指存储在数据库中的数据要能正确反映实际情况,规定输入的数据不能是无效值、错误值
或者乱码等。

一、非空约束:

非空约束关键字: not null

1**、非空约束的创建**

sql 复制代码
create table teacher(
t_id int not null, -- 为教师编号添加非空约束
t_name varchar(20),
t_age int,
t_sex varchar(4)
);
insert into teacher(t_name,t_age,t_sex) values('小李',18,'男');
-- 错误:非空约束规定插入的属性值不能为空,如:t_id
insert into teacher values(1,'小王',18,'男');

2**、非空约束的添加**

以修改表的方法添加非空约束:

sql 复制代码
alter table teacher modify column t_name varchar(30) not null;
insert into teacher(t_id,t_age,t_sex) values(3,20,'女');-- 报错

二、唯一约束

唯一约束关键字: unique

1**、创建唯一约束**

创建表时添加唯一约束:

sql 复制代码
create table teacher(
t_id int not null unique, -- 为教师编号添加非空且唯一的约束
t_name varchar(20),
t_age int,
t_sex varchar(4)
);

2**、修改表添加唯一约束**

sql 复制代码
alter table teacher add constraint uni_tid unique(t_id);
-- constraint关键字给约束unique(t_id)取一个别名为 uni_tid

若表中没有规定主键,那么表中第一个非空且唯一的属性自动添加主键约束

3**、给约束取别名**

通过 constraint 关键字给约束取别名

sql 复制代码
alter table teacher add constraint uni_tname unique(t_name);

4**、删除唯一约束**

根据约束名称删除唯一约束:

sql 复制代码
alter table teacher drop index uni_tid;

根据属性名称删除唯一约束:

sql 复制代码
alter table teacher drop index t_name;

5**、复合唯一约束****(联合唯一约束)**

①创建复合唯一约束

sql 复制代码
create table teacher(
t_id int not null, -- 为教师编号添加非空约束
t_name varchar(20),
t_age int,
t_sex varchar(4),
constraint uni_tidname unique(t_id,t_name) -- 对多个字段创建复合唯一约束,使字段不能同时一致
);

②修改表添加复合唯一约束

sql 复制代码
alter table teacher add constraint uni_tidname unique(t_id,t_name);

复合唯一约束不允许约束的属性列同时相同,至少要有一个不同。

三、主键约束

主键约束关键字: primary key

1**、创建表时添加主键约束**

sql 复制代码
create table teacher(
t_id int primary key, -- 为教师编号创建主键约束
t_name varchar(20),
t_age int,
t_sex varchar(4)
);

2**、修改表添加主键约束**

sql 复制代码
alter table teacher add primary key(t_id);

由于表中第一个非空且唯一的属性会默认成为主键,所以创建主键前要先删除这个属性的唯一约束:

sql 复制代码
alter table teacher drop index uni_tidname;

3**、删除主键约束**

sql 复制代码
alter table teacher drop primary key;
-- 由于一个表的的主键只有一个,直接丢掉即可,只要规定表名,可以不写约束名

4**、创建联合主键**

sql 复制代码
alter table teacher add primary key(t_id,t_name);

四、自增列

自增列约束关键字: auto_increment

1**、创建自增列**

创建表时添加自增列约束:

sql 复制代码
create table teacher(
t_id int primary key auto_increment, -- 为教师编号创建主键和自增列约束默认从100开
始
t_name varchar(20),
t_age int,
t_sex varchar(4)
)auto_increment = 100;-- 设置自增列的默认初始值从100开始

2**、添加自增列**

修改表添加自增列:

sql 复制代码
alter table teacher modify column t_id int auto_increment; 

3**、删除自增列**

sql 复制代码
alter table teacher modify column t_id int;
-- 在修改表时不添加自增列就是删除自增列,跟删除非空约束一样

五、检查约束

检查约束关键字: check
检查约束演示示例:
①创建表时添加检查约束

sql 复制代码
create table student(
id int primary key,
s_name varchar(20),
age int check(age>=0 and age=<150),
-- 约束年龄的取值范围为0~150之间
sex varchar(2) check(sex='男' or sex='女')
-- 约束性别的取值范围为'男'或'女'
);

六、默认值约束

1**、创建表时添加默认值约束**

默认值约束关键字: default

sql 复制代码
create table teacher(
t_id int primary key auto_increment, -- 为主键创建默认值约束
t_name varchar(20),
t_age int default '男',
t_sex varchar(4)
)auto_increment = 100;  -- 设置自增列的默认初始值从100开始

2**、修改表添加默认值约束**

sql 复制代码
alter table teacher modify column t_sex varchar(4) default '男';

3**、删除默认值约束**

sql 复制代码
alter table teacher modify column t_sex varchar(4);
-- 在修改表时不添加默认值约束就是删除默认值约束

七、外键约束

外键约束关键字: foreign key

1**、创建表添加外键约束**

学生、教师和班级的外键联系
创建被参考表 class

sql 复制代码
create table class(
class_id int primary key,
c_name varchar(20) not null,
c_num int, -- 班级人数
c_tid varchar(20) -- 外键约束参考与教师表
constraint for_ctid foreign key(c_tid) references teacher(t_id)
);
sql 复制代码
insert into class(class_id,c_name) values(1,'数据库'),
(2,'C++'),(3,'java'),(4,'python');

创建参考表****student:

sql 复制代码
create table student(
s_id int primary key,
s_name varchar(20) not null,
s_cid int not null,
s_age int,
s_sex varchar(4),
constraint for_scid foreign key(s_cid) references class(class_id)
);
sql 复制代码
insert into student(s_id,s_name,s_cid) values(1,'张三',1),(2,'李四',3),(3,'王五',2);

学生表中的班级编号参考班级表中的班级编号,学生不能给属于不存在的班级

sql 复制代码
insert into student(s_id,s_name,s_cid) values(4,'赵六',5);

2**、级联更新****/**删除

级联更新 / 删除是指父表中的元组更新或删除等操作对子表的处理方法,其有三种处理方法:
在更新 / 删除中( on update/on delete

sql 复制代码
-- ① cascade:父表中的元组更新或删除,在子表中跟着更新或者删除
# 在外键约束后加上:on update cascade/on delete cascade
-- ② no action:无动作,若子表中有匹配的记录,就不允许更新/删除父表的数据
# 在外键后加上:on update no action/on delete no action
-- ③ set null:设置为空,若子表中有匹配的记录,更新/删除父表中的数据,子表中对应数据设置为
空
# 在外键约束后加上:on update set null/on delete set null

学生表中存在有 3 号班级的学生,不允许删除 3 号班级

sql 复制代码
delete from class where class_id = 3;

创建参考表 student1

sql 复制代码
create table student1(
s_id int primary key,
s_name varchar(20) not null,
s_cid int not null,
s_age int,
s_sex varchar(4),
constraint for_scid1 foreign key(s_cid) references class(class_id) on update
cascade on delete no action -- 级联更新和删除
);
sql 复制代码
insert into student1(s_id,s_name,s_cid) values(1,'张三',1),
(2,'李四',3),(3,'王五',2);
delete from class where class_id = 2;
update class set class_id = 6 where class_id = 1;
drop table student;
相关推荐
做梦敲代码30 分钟前
达梦数据库-读写分离集群部署
数据库·达梦数据库
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger1 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud2 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡2 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷2 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库