【SQL数据库基础05-2】常见约束与标识列

article/2025/9/26 11:52:24

文章目录

  • 常见约束
    • 01 基本概念
      • 1.1 含义:
      • 1.2 分类:六大约束
      • 1.3 添加约束的时机:
      • 1.4 约束的添加分类:
      • 1.5 主键和唯一的大对比:
      • 1.6 外键:
    • 02 具体讲解
      • 2.1 创建表时添加约束
        • 1.添加列级约束
        • 2.添加表级约束
      • 2.2 修改表时添加约束
        • 1.添加列级约束
        • 2.添加表级约束
        • 3.案例实操
      • 2.3 修改表时删除约束
    • 03 案例实操
  • 标识列
      • 01 基本概念
      • 02 特点:
      • 03 案例演示
        • 3.1 创建表时设置标识列
        • 3.2 查询自增长的值
        • 3.3 修改步长
        • 3.4 需要修改起始值
        • 3.5 小结
      • 【学习资料】
        • 【01学习笔记】
        • 【02课程资料】

常见约束

01 基本概念

1.1 含义:

一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

1.2 分类:六大约束

NOT NULL:非空,用于保证该字段的值不能为空

比如姓名、学号等

DEFAULT:默认,用于保证该字段有默认值

比如性别

PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空

比如学号、员工编号等

UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空

	比如座位号

CHECK:检查约束【mysql中不支持】

 	比如年龄、性别

FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值

​ 在从表添加外键约束,用于引用主表中某列的值

比如学生表的专业编号,员工表的部门编号,员工表的工种编号

1.3 添加约束的时机:

1.创建表时

2.修改表时

1.4 约束的添加分类:

列级约束:六大约束语法上都支持,但外键约束没有效果

表级约束:除了非空、默认,其他的都支持

CREATE TABLE 表名(字段名 字段类型 列级约束,字段名 字段类型,表级约束
) 

1.5 主键和唯一的大对比:

保证唯一性是否允许为空一个表中可以有多少个是否允许组合
主键×至多有1个√,但不推荐
唯一可以有多个√,但不推荐

1.6 外键:

1、要求在从表设置外键关系

2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求

3、主表的关联列必须是一个key(一般是主键或唯一)

4、插入数据时,先插入主表,再插入从表

删除数据时,先删除从表,再删除主表

02 具体讲解

CREATE DATABASE students;

2.1 创建表时添加约束

1.添加列级约束

语法:

直接在字段名和类型后面追加 约束类型即可。

只支持:默认、非空、主键、唯一

USE students;
DROP TABLE stuinfo;
CREATE TABLE stuinfo(id INT PRIMARY KEY,#主键stuName VARCHAR(20) NOT NULL UNIQUE,#非空gender CHAR(1) CHECK(gender='男' OR gender ='女'),#检查seat INT UNIQUE,#唯一age INT DEFAULT  18,#默认约束majorId INT REFERENCES major(id)#外键
);
CREATE TABLE major(id INT PRIMARY KEY,majorName VARCHAR(20)
);

#查看stuinfo中的所有索引,包括主键、外键、唯一

SHOW INDEX FROM stuinfo;

image.png

2.添加表级约束

语法:在各个字段的最下面

【constraint 约束名】 约束类型(字段名)

DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(id INT,stuname VARCHAR(20),gender CHAR(1),seat INT,age INT,majorid INT,CONSTRAINT pk PRIMARY KEY(id),#主键CONSTRAINT uq UNIQUE(seat),#唯一键CONSTRAINT ck CHECK(gender ='男' OR gender  = '女'),#检查CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键 
);
SHOW INDEX FROM stuinfo;

通用的写法:★

CREATE TABLE IF NOT EXISTS stuinfo(id INT PRIMARY KEY,stuname VARCHAR(20),sex CHAR(1),age INT DEFAULT 18,seat INT UNIQUE,majorid INT,CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);

2.2 修改表时添加约束

1.添加列级约束

alter table 表名 modify column 字段名 字段类型 新约束;

2.添加表级约束

alter table 表名 addconstraint 约束名】 约束类型(字段名) 【外键的引用】;

案例:

DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(id INT,stuname VARCHAR(20),gender CHAR(1),seat INT,age INT,majorid INT
)
DESC stuinfo;

image.png

3.案例实操

#1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20)  NOT NULL;
#2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#3.添加主键
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#②表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#4.添加唯一
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#②表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5.添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id); 

2.3 修改表时删除约束

#1.删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
#3.删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
SHOW INDEX FROM stuinfo;

03 案例实操

1.向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)

ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;

ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);

2. 向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)

3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。

ALTER TABLE emp2 ADD COLUMN dept_id INT;

ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);

位置支持的约束类型是否可以起约束名
列级约束:列的后面语法都支持,但外键没有效果不可以
表级约束:所有列的下面默认和非空不支持,其他支持可以(主键没有效果)

标识列

01 基本概念

又称为自增长列

含义:可以不用手动的插入值,系统提供默认的序列值

02 特点:

1、标识列必须和主键搭配吗?不一定,但要求是一个key(主键、外键、唯一、自定义)

2、一个表可以有几个标识列?至多一个!

3、标识列的类型只能是数值型

4、标识列可以通过 SET auto_increment_increment=3;设置步长

可以通过 手动插入值,设置起始值

03 案例演示

3.1 创建表时设置标识列

DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(id INT  ,NAME FLOAT UNIQUE AUTO_INCREMENT,seat INT 
);
TRUNCATE TABLE tab_identity;
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');
SELECT * FROM tab_identity;

3.2 查询自增长的值

SHOW VARIABLES LIKE '%auto_increment%';

image.png

  • 步长
  • 起始值
  • MySQL不支持修改起始值

3.3 修改步长

SET auto_increment_increment=3;

image.png

3.4 需要修改起始值

就直接插入指定起始值,后面再插入NULL

3.5 小结

自增长列 特点:

1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1

auto_increment_increment

如果要更改起始值:手动插入值

如果要更改步长:更改系统变量

set auto_increment_increment=值;

2、一个表至多有一个自增长列

3、自增长列只能支持数值型

4、自增长列必须为一个key

一、创建表时设置自增长列

create table 表(

​ 字段名 字段类型 约束 auto_increment

)

二、修改表时设置自增长列

alter table 表 modify column 字段名 字段类型 约束 auto_increment

三、删除自增长列

alter table 表 modify column 字段名 字段类型 约束

【学习资料】

【01学习笔记】

  • 【SQL数据库基础01】数据库和SQL概述
  • 【SQL数据库基础02】MySQL最新版安装使用教程–(安装、卸载、登录、常用命令、语法规范、图形化界面SQLyog)
  • 【SQL数据库基础03】数据处理之查询 (•过滤和排序数据 •分组函数 •分组查询 •多表查询 •分页查询 •联合查询)
  • 【SQL查询系列】子查询经典案例
  • 【SQL数据库基础04】数据操纵语言DML,即SQL的增删改查
  • 【SQL数据库基础05】数据定义语言DDL-库表的管理、数据类型、常见的约束
  • 【SQL数据库基础05-1】常见的数据类型–• 数值类型• 字符类型• 日期类型
  • 【SQL数据库基础05-2】常见约束与标识列
  • 【SQL数据库基础06】事务控制语言TCL–事务(概念、特性、隔离级别、案例演示)
  • 【SQL数据库基础07】视图–定义、增删改查视图
  • 【SQL数据库基础08】变量–系统变量:全局、会话、自定义变量
  • 【SQL数据库基础09】存储过程
  • 【SQL数据库基础10】函数
  • 【SQL数据库基础11】流程控制结构

【02课程资料】

  • 《数据库系统概论(第5版)》
  • 计院学网盘复习资料–数据库
  • 尚硅谷MySQL核心技术-婷姐

http://chatgpt.dhexx.cn/article/WV7RZJnr.shtml

相关文章

关系数据库标准语言SQL视图模块

目录 一. 视图的特点 二. 基于视图的操作 2.1 建立视图 1)行列子集视图举例: 2)基于多个基表的视图: 3)基于视图的视图: 4)带表达式的视图: 5)建立分组视图&am…

Oracle的视图,索引,约束,事务,数据库范式

🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习…

(数据库系统概论|王珊)第三章关系数据库标准语言SQL-第一节:SQL概述

pdf下载:密码7281专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解 文章目录 一:SQL的产生与发展二:SQL特点(1&a…

第三章 关系数据库标准语言 SQL

第三章 关系数据库标准语言 SQL 文章目录 第三章 关系数据库标准语言 SQL3.1 SQL 概述3.1.1 SQL 的特点 3.2 学生-课程数据库3.3 数据定义3.3.2 基本表的创建、删除与修改1. 基本表的创建2. 数据类型3. 插入数据4. 修改数据(1) 修改某一个元组的值(2) 修…

(九)密度聚类、层次聚类和轮廓系数[机器学习代码实现]

机器学习课程总结,本系列文章以代码和注释为主。 理论部分搬至博客上比较耗费时间,所以缺少理论部分。但是也欢迎大家一起探讨学习。 如果需要理论部分的讲义,可私信(个人觉的讲的很好很全)。 文章目录 问题需…

Oracle 数据库中的 索引、约束、视图

约束:就是指对插入数据的各种限制,约束既可在建表的时候直接声明,也可以为已经建好的表添加约束。 视图:就是一个封装了各种复杂查询的语句,就称之为视图。 索引:是一种用于提升查询效率的数据库对象。通过…

数据库原理与应用(SQL)——2、关系数据库(E-R图、关系模式、关系运算、关系代数)

目录 关系 关系运算 元组、域关系演算表达式 题目 关系代数表达式——例 元组演算表达式——例 域演算表达式——例 关系数据库是以二维表形式组织数据,应用数学方法处理数据库组织的方法。目前关系数据库系统在数据管理中已占据了主导地位。 关系 关系&…

Oracle约束 SQL语句分类 集合运算 索引 相关知识点讲解

ORACLE 约束: 数据库用来确保数据满足业务的手段,强制数据符合某些特定条件或者规范才可以插入 主键约束: primary key PK唯一约束:unique非空约束:not null外键约束:foreign key FK检查约束:…

SQL对数据进行统计、常用集合函数

学生表: 1、统计记录个数 1) count(【all】*)【as 列别名】 返回表中的记录数 执行:SELECT COUNT (* ) FROM 学生表 结果为: 执行:SELECT COUNT (* ) as 学生总人数 FROM 学生表…

关系数据库SQL数据查询

关系数据库SQL数据查询 数据查询 一、单表查询 1.查询仅涉及一个表,选择表中的若干列 [例1] 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student; [例2] 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;查询全部列 选出所有属…

样本轮廓系数(原理、sklearn.metrics.silhouette_score、silhouette_samples参数介绍)

一、轮廓系数含义: 轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。 最佳值为1,最差值为-1。接近0的值表示重叠的群集。负值通常表示样本已分配给错误的聚类,因为不同的聚类更为相…

java上位机开发(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 目前对于java语言,很多人都认为太简单。其实这是不对的,因为某种意义上来说所,java语言就像学习日语一样&#…

Qt之上位机开发实战(一)

一、Qt三大金刚 1、qt下的串口编程 2、qt下的网络编程 3、qt下的GPIO 本章节先介绍一下qt下的串口编程,首先我们新建一个Widget项目 其中接受框使用Plain Text Edit(设置只读),串口号等按钮使用Combo Box,发送框使…

C# | 上位机开发新手指南(二)上位机通信

上位机开发新手指南(二)上位机通信 文章目录 上位机开发新手指南(二)上位机通信前言串口通信应用场景与控制器通信与传感器通信与仪器仪表通信与智能家居设备通信 常见协议ModbusCAN(Controller Area Network&#xff…

C# 西门子PLC上位机开发环境搭建

一、安装软件 1. TIA_Portal_STEP7 15 博途,西门子的自动化开发软件 2. SIMATIC_S7PLCSIM_V15_1 西门子的仿真软件 3. NetToPLCsim C#程序是不能和仿真通信的,只有利用此软件,C#程序才能连接到仿真 二、配置软件 1. 博途 点击 创建新…

java上位机开发(网络编程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓的网络编程,一般就是指UDP、TCP编程。传统的方法就是用api或者sdk直接编程,这种方法对于简单的协议是可以的。但是对于…

上位机开发(详细设计)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 所谓软件详细设计,它的上面对应的是架构设计,下面对应的是程序开发。架构设计有可能涉及多个软件,比如既可能涉及上位机这端,也可能涉及到mcu这端。详细设计的话,一般要落实到…

android ble 上位机,BLE的Android上位机开发(下)

原标题:BLE的Android上位机开发(下) ELLO! 大家好!马上就更新下篇了呢~哈哈!(上篇的地址:BLE的Android上位机开发(上))废话不多说了,先上主角吧!代码如下! [Java] 纯文本查看复制代码 ? 01 02 …

java上位机开发(java基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 java基础就是把java环境安装好,把基础程序构建起来。至少说让开发的同学来说有一点信心。从这一点来说,就算编写一个“Hell…

上位机开发的意义

上位机开发的意义 常见的上位机定义为一台可以发出特定操控命令的计算机, 通过操作预先设定好的命令,将命令传递给下位机,通过下位机来控制设备完成各项操作。此定义着重于强调控制指令的发送,实际上除了发送控制命令&#xff0c…