一篇文章带你弄懂如何对数据库中的数据进行约束

阅读指南:
本文章讲述了对于数据库中的数据的基本操作,主要包括对约束的讲解和对行或者列数据如何进行约束,两个主要方面,如果读者感兴趣,后续我们会更新高级的操作在我们的对于数据库教程的合集中,大家可以来很我们一起学习讨论
合集链接:
数据库详细基础教程

约束

1.约束概念:

是表级别的规定,对于表中的数据进行限制语法

作用:

确保表中数据的可靠性,准确性和正确性

添加时机:

  1. 创建表的时候直接添加
  2. 创建表之后,通过 ALTER TABLE 语句添加。

2.约束分类:

a. 域(列)级约束

注:此类约束只针对当且列值有效,例如:某列的值不能为NULL。

  • 非空约束:NOT NULL,列非空约束;
  • 默认值约束:DEFAULT,某列默认值;
  • 检查约束:CHECK,检查约束;

b. 实体(行)级约束

注:此类约束需要对比同一表中其他行数据,才有效果。例如:某列值必须唯一。

  • 主键约束:PRIMARY KEY,主键唯一且不为空约束;
  • 唯一约束:UNIQUE,限制某一列 值 表中唯一;
  • 自增长约束:AUTO_INCREMENT,数字类型字段插入数据时自增长约束;

c. 引用(多表)级约束

注:此类约束需要对比其他表的列才能有效果,例如:在 A 表中有学生的 id,在 B 表中要引用其 id时,则添加约束来提升可靠性等。

  • 参照(外表)约束:FOREING KEY,限定表中某一列,正确引用其他表的数据值;

接下来开始分类讲解:

域(列)级约束

1. 非空约束

作用:

​ 限定某个字段(列)的值不允许为空

关键字:

NOT NULL

特点:

​ 默认:所有类型列默认都可以为NULL,包括数字类型;

​ 列上添加:非空约束只能添加到列的上面;

​ 多次使用:sql允许对多列进行非空约束;

​ 空值判定:空字符串不是NULL,0也不是NULL;

语法:

# 建表时添加
CREAT TABLE 表名词(
	字段名 数据类型,
    字段名 数据类型 NOT NULL,
    字段名 数据类型 NOT NULL,
);

# 建表后添加
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL;

# 去掉约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NULL;ALTER TABLE 表名称 MODIFY 字段名 数据类型;  # 因为默认情况下是允许为NULL

示例:

CREATE TABLE emp1(
   id INT(10) NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   sex CHAR(1)
);

ALTER TABLE emp1 MODIFY sex char(1) not NULL;

ALTER TABLE emp1 MODIFY sex varchar(30) NULL;

2.默认值约束

作用:

​ 限定某个字段(列)的添加默认值

关键字:

DEFAULT 默认值

特点:

​ 位置约定:默认值约束不能添加到唯一或者主键上,其他列都可以。

​ 生效时机:当插入数据时,没有显示赋值,赋予默认值。

​ 细节:添加约束时,DEFAULT 默认值,默认值要与当前列的数据类型相对应

语法:

# 建表时添加
CREAT TABLE 表名称 (
	字段名 数据类型 DEFAULT 默认值,
	字段名 数据类型 NOT NULL DEFAULT 默认值
);
# 建表后添加
ALTER TABLE 表名称 MODIFY 字段名 数据类型 DEFAULT 默认值;
# 建表后添加的同时,还要保持其非空
ALTER TABLE 表名称 MODIFY 字段名 数据类型 DEFAULT 默认值 NOT NULL;

# 删除约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型;
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL;

示例:

CREATE TABLE emp2(
   id INT(10)  default 0,
   NAME VARCHAR(20) NOT NULL default ‘二狗子’
);

alter table emp2 modify name varchar(20) default '' not null ;  

alter table emp2 modify tel char(11) default ‘’; 

alter table employee modify gender char; 

alter table employee modify tel char(11)  not null;

3.检查约束

作用:

​ 检查某个字段的值是否符合我们自定义的限制需求,一般指的是值的范围

关键字:

CHECK (限定表达式)

特点:

​ 新特性:8以上的版本支持。

​ 万能约束:CHECK(表达式),可以自定义,变成任何约束。

​ 不推荐:在进行数据检查时,不推荐使用CHECK约束,建议使用程序级的限制。

语法:

# 建表时添加
CREAT TABLE 表名称(
	字段名 数据类型,
    CHECK(表达式),		# CHECK 约束属于表级别,不用添加到表的后面
    字段名 数据类型 NOT NULL DEFAULT (默认值)
);

# 建表后修改
ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(表达式);	# 约束名不能重复

# 删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名;

# 查看检查约束名等相关信息
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = '库名'
AND TABLE_NAME = '表名';


示例:

CREAT TABLE emp3(
	gender CHAR,
	CHECK(gender IN ('男', '女')),	# 若要删除此处的限定,则先需要查看检查约束对这个的限制所起的名字,再通过删除语法进行删除

);

# 添加约束限制
ALTER TABLE emp3 ADD CONSTRAINT age_ck CHECK(age > 18);

# 删除约束
ALTER TABLE emp3 DROP CONSTRAINT age_ck;

实体(行)级约束

1.唯一约束

作用:
限定某个字段或者组合字段,在表中的数据是唯一的

关键字:

UNIQUE

特点:
约束数量:同一表中可以有多个唯一约束

​ 空值处理:唯一性约束允许列值为空

​ 约束名称:在创建唯一约束的时候,如果不能给唯一约束命名,就默认与列名相同

语法:

# 建表时添加
CREAT TABLE 表名称(
	字段名 数据类型 UNIQUE,
	字段名 数据类型 UNIQUE KEY
);

CREAT TABLE 表名称(
	字段名 数据类型;
	[CONSTRAINT 约束名] UNIQUE KEY (字段名)
)# 建表后修改
ALTER TABLE table_name ADD CONSTAINT constaint_name UNIQUE(列名, 列名);

# 删除约束
ALTER TABLE table_name DROP CONSTRAINT constaint_name;

# 查看约束
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = '库名'
AND TABLE_NAME = '表名';

示例:

# 建表时创建
CREATE TABLE emp4(
	NAME VARCHAR(20),
    phone VARCHAR(11) UNIQUE
);CREATE TABLE emp4(
	NAME VARCHAR(20),
    phone VARCHAR(11) UNIQUE KEY
);CREATE TABLE emp4(
	NAME VARCHAR(20),
    phone VARCHAR(11),
    UNIQUE KEY(phone)
);
# 创建后添加
ALTER TABLE emp4 ADD CONSTRAINT emp4_name UNIQUE KEY (NAME);

# 删除唯一约束
ALTER TABLE emp4 DROP CONSTRAINT emp4_name;

3.主键约束

主键:

​ 在表中,有一列的内容永远是不相同的,则这一列我们称为主键列,例如:学生信息表中,学生的学号是不会重复的,所以学号的那一列称为主键(主键列)

主键分类:

​ 自定义主键:人为创建的一列为主键,比如学号

​ 自然主键(了解即可):数据实体自带的属性列,比如DNA序列

特点:

​ 主键数量:一个表只能有一个主键

​ 单一和重复:主键可以有单个列或者多个列构成(复合主键)

​ 主键列类型:可以是任意类型,只要唯一且不重复就行

​ 主键命名:主键一般采用identif(标识),但没有强制要求

​ 主键索引:创建主键约束的时候,系统默认会在所在列或组合上建立对应的主键索引(能够根据主键查询的)。如果主键约束删除了,主键约束对应的索引就自动删除,主键索引固定命名:PRIMARY。

主键约束:

概念:
针对主键列的数据进行约束和限制

语法:

# 建表时添加
CREAT TABLE 表名称(
	字段名 数据类型 PRIMARY KEY, # 列级模式
);
CREAT TABLE 表名称(
	字段名 数据类型,
    [CONSTRAINT 约束名] PRIMARY KEY(字段名) # 表级模式
);

# 建表后修改
ALTER TABLE 表名称 ADD PRIMARY(字段列表);	# 字段列表可以是一个字段,也可以是多个字段

# 删除主键约束和索引
ALTER TABLE 表名称 DROP PRIMARY KEY;

示例:

CREATE TABLE emp5(
	e_id INT,
    e_name VARCHAR(20),
    e_age INT,
    PRIMARY KEY (e_id, e_name)
);

ALTER TABLE emp5 ADD PRIMARY KEY(e_id);

ALTER TABLE emp5 DROP PRIMARY KEY;

4.自增长约束

作用:
限定某个整数类型字段,插入数据不显示维护,值自动增长

关键字:

AUTO_INCREMENT

特点:

​ 添加位置:只能添加在主键或者唯一列上面

​ 约束数量:每张表都只能有一个自增长约束(通常在主键上面)

​ 数据类型:增加自增长约束的列必须是整数类型

​ 特殊情况:如果给自增长字段设置0或者NULL时,列数据会自增长赋值,如果设置的是非零和非空数据,那么将真实设置值

# 建表时添加
CREATE TABLE 表名称(
	字段名 数据类型 PRIMARY KEY AUTO_INCREMENT,	# 主键
);

CREATE TABLE 表名称(
	字段名 数据类型 UNIQUE KEY AUTO_INCREMENT,	# 不重复值的列
);

# 建表后修改
ALTER TABLE 表名称 MODIFY 字段名 数据类 AUTO_INCREMENT;

# 删除自增长约束
ALTER TABLE 表名称 MODIFY 字段名 数据类型; 

参照引用(外键 or 外表)约束

外键:

​ 引用其他表的主键的列。外键的范围应当对应应用主键的值的范围

外键的特点:
外键的数量:每个表中可以包含多个外键;

​ 外键跨表:外键是跨表引用其他表的主键,被引用表为主表,外键表为子表;

​ 外键类型:外键类型应该与其引用的外表的主键的类型一致;

​ 主外表之间的约束:当删除含有外表的主表数据时,要先移除子表的引用数据,再删除主表的数据。

语法:

# 建表时添加
CREATE TABLE 主表名称(
	字段1 数据类型 PRIMARY KEY
);

# 子表中添加主外键约束
CREATE TABLE 子表名称(
	字段1 数据类型 PRIMARY KEY,
    [CONSTRAINT <外键约束名称>]FOREING KEY(外键)
    REFERENCES 主表名(主键) [on update xx][on delete xx]
);

# 建表后修改
ALTER TABLE 从表名 ADD [CONSRTAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用字段) [ON UPDATE xx] [ON DELETE xx]

# 删除外键约束
# 第一步先查看约束名和删除外键约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';#查看某个表的约束名
ALTER TABLE 从表名 DROP FOREIGN KEY 外键约束名;

# 第二步查看索引名和删除索引。(注意,只能手动删除)
SHOW INDEX FROM 表名称; #查看某个表的索引名
ALTER TABLE 从表名 DROP INDEX 索引名;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值