数据库基础入门 — 约束

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 数据库基础入门 — 约束

约束类型

查看表约束语句

#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 增加/删除
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
27天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
108 0
|
27天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
27天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
27天前
|
监控 关系型数据库 MySQL
轻松入门MySQL:主键设计的智慧,构建高效数据库的三种策略解析(5)
轻松入门MySQL:主键设计的智慧,构建高效数据库的三种策略解析(5)
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
31 0
|
23天前
|
存储 关系型数据库 MySQL
MySQL基础入门:数据库操作全攻略
MySQL基础入门:数据库操作全攻略
50 0
|
27天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
|
27天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
6天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
6天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互