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;
相关推荐
kejijianwen2 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石5 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆5 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0666 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下6 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss7 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk7 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK8 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D8 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa