SQL基础⑪ | 约束

0 序言

本文主要围绕数据库约束讲起,涵盖约束的基本概念分类及各类约束(非空、唯一、主键、自增列、外键、CHECK、DEFAULT)的作用、特点、操作方法与示例。

通过学习,可掌握约束的定义逻辑、使用场景及实操技能,理解其在保证数据完整性中的关键作用。

1 约束(constraint)概述

1.1 为什么需要约束

从数据完整性来说,

  • 数据完整性(Data Integrity)指数据的精确性(Accuracy)和可靠性(Reliability),目的是防止数据库中存在不符合语义规定的数据,避免错误信息导致无效操作或错误。

我们可以从四方面保证数据完整性:

  • 实体完整性:如同一表中不能有两条完全相同无法区分的记录。
  • 域完整性:如年龄范围0-120,性别范围“男/女”。
  • 引用完整性:如员工所在部门需在部门表中存在。
  • 用户自定义完整性:如用户名唯一、密码不能为空等。

1.2 什么是约束

约束是表级的强制规定,可在创建表时(通过CREATE TABLE语句)或表创建后(通过ALTER TABLE语句)设置。

1.3 约束的分类

1.3.1 按约束数据列的限制

  • 单列约束:每个约束仅约束一列。
  • 多列约束:每个约束可约束多列数据。

1.3.2 按约束的作用范围

  • 列级约束:作用于单个列,跟在列定义后。
    • 支持的约束类型:语法上都支持,但外键无效果。
    • 是否可起约束名:不可以。
  • 表级约束:作用于多个列,单独定义在所有列下方。
    • 支持的约束类型:默认和非空不支持,其他支持。
    • 是否可起约束名:可以(主键无效果)。

1.3.3 按约束的作用

  • NOT NULL:非空约束,规定字段不能为空。
  • UNIQUE:唯一约束,规定字段在表中唯一。
  • PRIMARY KEY:主键约束(非空且唯一)。
  • FOREIGN KEY:外键约束。
  • CHECK:检查约束。
  • DEFAULT:默认值约束。

1.4 查看表的约束

通过查询系统库信息查看:

SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';

在这里插入图片描述
这里就可以看到表约束详情。

2 非空约束(NOT NULL)

2.1 作用

限定某个字段/列的值不允许为空。
关键字为:NOT NULL

2.2 特点

  • 默认情况下,所有类型的值都可为NULL(包括INT、FLOAT等)。
  • 非空约束仅作用于单个列,一个表可有多列设非空约束。
  • 空字符串’'≠NULL,0≠NULL。

2.3 添加非空约束

2.3.1 建表时添加

CREATE TABLE 表名称(
  字段名 数据类型,
  字段名 数据类型 NOT NULL,
  字段名 数据类型 NOT NULL
);

-- 示例
CREATE TABLE emp(
  NAME VARCHAR(20) NOT NULL,
  sex CHAR NULL
);

CREATE TABLE student(
  sid INT,
  sname VARCHAR(20) NOT NULL,
  tel CHAR(11),
  cardid CHAR(18) NOT NULL
);
  • 插入数据示例:
-- 成功(所有非空字段均赋值)
INSERT INTO student VALUES(1,'张三','13710011002','110222198912032545');
-- 失败(cardid为NULL,违反非空约束)
INSERT INTO student VALUES(2,'李四','13710011002',NULL);
-- 成功(tel允许为空)
INSERT INTO student VALUES(2,'李四',NULL,'110222198912032546');
-- 失败(sname为NULL,违反非空约束)
INSERT INTO student VALUES(3,NULL,NULL,'110222198912032547');

在这里插入图片描述

可以自己动手试一下,

规则出错会弹出错误信息,

但只要满足建表是设定好的约束条件即可。

2.3.2 建表后添加

ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL;

-- 示例
ALTER TABLE emp MODIFY sex VARCHAR(30) NOT NULL;
ALTER TABLE student MODIFY sname VARCHAR(20) NOT NULL;

这样就可以在已有的表格进行约束添加。

2.4 删除非空约束

-- 方式1:显式指定NULL
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NULL;
-- 方式2:不指定NOT NULL(默认允许为空)
ALTER TABLE 表名称 MODIFY 字段名 数据类型;

-- 示例
ALTER TABLE emp MODIFY sex VARCHAR(30) NULL;
ALTER TABLE emp MODIFY NAME VARCHAR(15) DEFAULT 'abc' NULL;

3 唯一约束(UNIQUE)

限制某个字段/列的值在整个表中唯一

这里核心就是唯一,关键字为:UNIQUE

3.1 特点

  • 一个表可有多个唯一约束
  • 可约束单个列或多列组合(复合唯一)。
  • 允许列值为空(可多个NULL)。
  • 未命名时,默认与列名相同(单列)或与组合列中第一个列名相同(多列)。
  • MySQL会为唯一约束列自动创建唯一索引

3.2 添加唯一约束

3.2.1 建表时添加

-- 列级约束方式
CREATE TABLE 表名称(
  字段名 数据类型,
  字段名 数据类型 UNIQUE,
  字段名 数据类型 UNIQUE KEY
);

-- 表级约束方式
CREATE TABLE 表名称(
  字段名 数据类型,
  字段名 数据类型,
  字段名 数据类型,
  CONSTRAINT 约束名 UNIQUE KEY(字段名)
);

-- 示例
CREATE TABLE student(
  sname VARCHAR(20),
  tel CHAR(11) UNIQUE,
  cardid CHAR(18) UNIQUE KEY
);

CREATE TABLE t_course(
  cid INT UNIQUE,
  cname VARCHAR(100) UNIQUE,
  description VARCHAR(200)
);

-- 复合唯一(用户名和密码组合唯一)
CREATE TABLE USER(
  id INT NOT NULL,
  NAME VARCHAR(25),
  PASSWORD VARCHAR(16),
  C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值