数据库基础入门 — 约束

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 数据库基础入门 — 约束

约束类型

查看表约束语句

#information_schema数据库名(系统库)
#table_constraints表名称(专门存储各个表的约束)
SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';

根据约束条件约束可以分为

  1. NOT NULL 非空约束,规定某个字段不能为空
/*只能列级约束
*/
create table ceshi (
  id int not null,
  name varchar(18) not null,
  email varchar(30)
)
-- 直接在字段名后面加 not null即可
alter table ceshi
modify email varchar(30) not null 
  1. UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
/*可以表级约束,或者列级约束
*/
create table ceshi2(
  id int unique,
  email varchar(30),
--表级约束
 -- constraint uk_ceshi2_email unique key(email)
 --另外一种,或者不添加constraint 和 约束别名
  unique key(email)
)

复合约束

create table ceshi2(
  id int unique,
  email varchar(30),
--表级约束
  constraint uk_ceshi2_id_email unique key(email,id)
)

删除约束

--可以直接约束字段或者约束别名
alter table ceshi2
drop index id ;

添加约束

--在实际开发中,不会删除主键约束,此处仅作示例
alter table test
add primary key(id);
  1. PRIMARY KEY 主键(非空且唯一)约束
--列级约束
create table test(
  id int primary key,
  name varchar(20),
  email varchar(30)
)
--复合表级约束
create table test(
  id int,
  name varchar(20),
  email varchar(30),
  pwd varchar(18),
  primary key(name,pwd)
)
  1. FOREIGN KEY 外键约束

有关数据的引用完整性,一般在开发中不建议使用外键,一般在应用层面(即后端(Java或者其他后端语言))解决

原因:

外键约束是有成本的,需要消耗系统资源。

即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。

/*
需要先创建主表,再创建从表
主表和从表的字段名的数据类型必须保持一致,字段名可以不一致
*/
-- ①先创建主表,并且从表外键的创建,主表必须创建主键,并且外键必须于主表主键关联
CREATE table departments (
dep_id int primary key,
dep_name varchar(20)
);
--②创建从表
CREATE table employees(
name varchar(20),
department_id int,
constraint uk_emplyees_depament_id foreign key(department_id) references departments(dep_id)
);
desc employees;
SELECT * FROM information_schema.table_constraints;
WHERE table_name = 'employees';

主从同步 方法

/*创建表时,在从表的外键约束,最好是添加采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。*/
CREATE table departments (
dep_id int primary key,
dep_name varchar(20)
);
--②创建从表
CREATE table employees(
name varchar(20),
department_id int,
foreign key(department_id) references departments(dep_id) on update cascade on delete set null
);
  1. CHECK 检查约束

MySQL5.7不支持此约束,MySQL8.0以上支持

create table salary(
  salary decimal(10,2) check(salary > 2000)
);
SELECT * FROM salary;
insert into  salary 
values (20000);
--在MySQL8.0以上,应该会提示报错插入失败
insert into  salary 
values (1900);
  1. DEFAULT 默认值约束
create table emp(
name varchar(20),
id int auto_increment primary key ,
salary decimal(20,2) default 20000
);
insert into emp(name)
values('nanchengyu');
SELECT * FROM emp;
--删除default
alter table emp
modify salary decimal(10,2) ;
desc emp;

面试1、为什么建表时,加 not null default '' 或 default 0

答:不想让表中出现null值。

面试2、为什么不想要 null 的值

答:(1)不好比较。null是一种特殊值,比较时只能用专门的is null 和 is not null来比较。碰到运算符,通常返回null。

(2)效率不高。影响提高索引效果。因此,我们往往在建表时 not null default '' 或 default 0

面试3、带AUTO_INCREMENT约束的字段值是从1开始的吗?

在MySQL中,默认AUTO_INCREMENT的初始值是1,每新增一条记录,字段值自动加1。设置自增属性(AUTO_INCREMENT)的时候,还可以指定第一条插入记录的自增字段的值,这样新插入的记录的自增字段值从初始值开始递增,如在表中插入第一条记录,同时指定id值为5,则以后插入的记录的id值就会从6开始往上增加。添加主键约束时,往往需要设置字段自动增加属性。

面试4、并不是每个表都可以任意选择存储引擎? 外键约束(FOREIGN KEY)不能跨引擎使用。

MySQL支持多种存储引擎,每一个表都可以指定一个不同的存储引擎,需要注意的是:外键约束是用来保证数据的参照完整性的,如果表之间需要关联外键,却指定了不同的存储引擎,那么这些表之间是不能创建外键约束的。所以说,存储引擎的选择也不完全是随意的。


补充

/*
只适合作用于整数型数据类型
只能作用于唯一约束,即unique,和primary key
*/
create table test1(
  id int primary key auto_increment,
  name varchar(20)
)
--开发时,一段给主键作用于响应字段,插入相应字段数据时,一般不要继续添加

使用约束

  1. 创建表时 create table
  2. 修改表时 alter table 增加/删除
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
3月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
453 7
|
5月前
|
存储 安全 关系型数据库
MySQL数据库约束条件概述及其重要性讨论。
正确地实现并管理好各类紧缩条件将直接影响到企业信息管理水平与服务质量,在当今大数据背景下更显得格外重要;任何设计师都需要深刻理解其原理与运作机晰承担起责任使得所托管资料安全稳固同时又具备良好伸缩灵活度迎合日益复杂商务需求变动.
197 11
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
815 3
SpringBoot入门 - 添加内存数据库H2
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
304 4
SpringBoot入门(4) - 添加内存数据库H2
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
1267 0
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
186 2
SpringBoot入门(4) - 添加内存数据库H2
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
198 13
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
266 4
|
SQL 存储 NoSQL
Redis6入门到实战------ 一、NoSQL数据库简介
这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
Redis6入门到实战------ 一、NoSQL数据库简介
|
存储 人工智能 Java
Neo4j从入门到精通:打造高效知识图谱数据库 | AI应用开发
在大数据和人工智能时代,知识图谱作为一种高效的数据表示和查询方式,逐渐受到广泛关注。本文从入门到精通,详细介绍知识图谱及其存储工具Neo4j,涵盖知识图谱的介绍、Neo4j的特点、安装步骤、使用方法(创建、查询)及Cypher查询语言的详细讲解。通过本文,读者将全面了解如何利用Neo4j处理复杂关系数据。【10月更文挑战第14天】
1671 6