首页 > 数据库 >MySQL约束详解:构建数据完整性基石

MySQL约束详解:构建数据完整性基石

时间:2024-06-17 22:28:32浏览次数:28  
标签:数据完整性 insert -- 约束 int 详解 MySQL tb 主键

目录

MySQL约束

  • MySQL作为广泛使用的开源关系型数据库管理系统,其强大的数据约束功能对于维护数据的一致性和准确性至关重要。

本文将深入探讨MySQL中的几种主要约束类型,以及如何在创建表时应用它们来确保数据的完整性。


1.1 约束

是什么? 约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新


怎么做?

约束设置的语法,大部分是

create table 表名(
字段 数据类型(长度) 约束,
字段 数据类型(长度) 约束
);

另外一种是建表后,使用alter语句修改表添加约束

1.1 数据类型

其实数据类型也是一种约束,例如设置id列为int类型,那就不能乱给id设置字符串或者日期等数据

1.2 主键约束[重要]

主键(primary key)约束非常重要,以后开发中基本上每张表都要有主键约束,作用是设置了主键约束的列,有以下效果

  • 不能为空
  • 不能重复

一般主键是给id设置的

设置主键方式有四种:

  • 在建表时给列直接指定
  • 在建表语句的最后指定某一列是主键
  • 给以建好的表修改设置主键
  • 图形化操作
-- ============= 演示主键约束 =============
-- 方式1:建表时指定主键
create table tb_a(
 id int primary key,-- 主键
 name varchar(20)
)
-- 不插入主键会报错(主键不能为空)
insert into tb_a (name) value ("aaa");
-- 插入2遍也报错(主键不能重复)
insert into tb_a (id,name) value (1,"aaa");
-- 方式2:建表时指定主键(放在下面指定主键)
create table tb_b(
 uid int,
 oid int,
 name varchar(20),
 primary key(uid,oid) -- 一般用于联合主键
)
-- 联合主键是两个列都重复才算重复
-- 方式3: 建表后通过修改设置主键
alter table stu add primary key (sid);
-- 方式4: 图形化操作

在这里插入图片描述

1.3 自增约束

自增(auto_increment)约束,主要是配合主键使用,防止主键为空,重复

-- ================= 主键自增 =================
create table tb_c(
id int primary key auto_increment,-- 主键自增
name varchar(20)
)
-- 插入时不插入主键,主键为自动赋值
-- 多插入几次,主键会自增
insert into tb_c (name) values ("cccc");
-- 删除一个
delete from tb_c where id = 4;
-- 再插入,自增顺序是不会回退,继续递增

在这里插入图片描述

1.4 唯一约束

  • 定义:确保该列中的所有值都是唯一的,但允许有一个NULL值。
  • 应用场景:用于需要唯一标识符但不作为主键的场景,如用户的电子邮件地址。
  • 示例:
-- ================= 唯一自增 =================
create table tb_d (
 id int,
 name varchar(20) unique -- 唯一约束
);
-- 插入name列,重复值会报错
insert into tb_d (id,name) values (1,"d");

-- 唯一约束也是唯一索引(索引,数据库高级知识常用于优化sql,提高查询速度)

在这里插入图片描述

1.5 非空约束

  • 定义:非空约束要求被标记的列不能包含NULL值。
  • 应用场景:适用于那些必须有值的字段,如用户姓名、电子邮件地址等。
  • 示例:
-- ================= 非空 =================
create table tb_e(
 id int,
 name varchar(20) not null -- 非空
);
-- 正常插入可以
insert into tb_e values (1,"eee")
-- 不插入name列,name为空会报错,因为约束为非空
insert into tb_e (id) values (2)

在这里插入图片描述

1.6 默认值

默认值(default),给列设置默认值约束后,如果该列在插入数据时没有给值,就自动赋值默认值

-- ================= 默认值 =================
create table tb_f(
 id int,
 sex char(1) default "男" -- 默认值
);
-- 插入数据,不指定性别,填充默认值
insert into tb_f (id) value (1)

在这里插入图片描述

代码演示
/*
设计表,添加约束
  1.数据类型也属于一种约束
  2.主键约束 primary key
	设置主键的字段:
	    不能为空
	    不能重复
	四种方式:
	1建表时在字段(列)后面直接添加
	2建表时在最后添加
	3建表完成后,利用update设置
	4利用软件图形化设置
  3.自增约束 auto_increment
	语法:字段(列)后设置
	主要配合主键使用(防止主键为空,重复)
  4.唯一约束 unique
	语法:字段(列)后设置
	作用:字段值不能重复,唯一性
  5.非空约束 not null
	语法:字段(列)后设置
	作用:字段值不能为空
  6.默认约束 default 
	语法:default 默认值
	作用:没有主动设置字段值时,系统默认赋值默认值
*/

-- 创建学生表 student
create table student(
-- 设置主键约束,配合自增约束使用
  sid int primary key auto_increment, 
  sname varchar(10),
-- 设置默认值
  age int default 18 
);
insert into student(sname) values ("王五");
insert into student(sname) values ("李四");
-- 建表时在最后添加主键
create table student2(
  sid int,
  oid int,
-- 设置唯一约束
  sname varchar(10) unique,
  sage int default 18,
-- 一般用于联合主键
  primary key(sid,oid)
);
insert into student2(sname) values ("张三");
-- 插入相同名字
insert into student2(sname) values ("张三");
-- 错误代码:1364 Field 'sid' doesn't have a default value


在这里插入图片描述

1.7 外键约束[了解]

外键,是多表之间接的一种关联关系的一种限制.

语法

constraint 外键名 foreign key (当前表中的列名) references 表(主键);

设计订单表和商品表,订单表的数据要关联商品表数据

-- 商品表
create table tb_goods(
 gid int primary key,
 gname varchar(20),
 descr varchar(20)
);

-- 订单表 (订单表关联了商品表)
create table tb_order(
 oid int primary key,
 order_time datetime,
 gid int,
 -- 设置外键
 constraint fk_order_goods foreign key(gid) references tb_goods(gid)
);
/*
 被引用的表称为父表 parent , tb_goods
 引用别人的表称为子表 child , tb_order
*/
-- 给父表随便插入数据
insert into tb_goods values (2,'键盘','敲代码没有bug');
-- 给子表随便插入数据不行!! 这个数据得是父表中有的才行
insert into tb_order values (1,'2022-11-11',1);
-- 子表可以删除数据
delete from tb_order where oid = 1;

-- 父表被引用的数据不能删除
delete from tb_goods where gid = 2;
delete from tb_goods where gid = 1;

image-20230505165521214

思维导图

在这里插入图片描述


最后

如果感觉有收获的话,点个赞

标签:数据完整性,insert,--,约束,int,详解,MySQL,tb,主键
From: https://blog.csdn.net/m0_73940426/article/details/139752561

相关文章

  • mysql手册
    查看mysql的配置文件位置mysql--help|grep"Defaultoptions"-C1输出如下,可知mysql读取默认选项的位置修改mysqlcmd提示符修改提示符有两种方法配置文件通常在~/.my.cnf中配置prompt命令在mysqlcmd中使用prompt[text]设置提示符格式对于不是控制字符的字符,......
  • MySQL数据库管理补充
    目录一.数据表高级操作1.克隆表2.清空表3.创建临时表4.创建外键约束外键的定义主键表和外键表的理解4.1.创建主从表4.2.主从表中插入数据4.3.主从表中删除数据4.4.删除外检约束二.数据库用户管理1.新建用户2.查看用户信息3.重命名用户4.删除用户5.修改当前登......
  • Oracle 12C的闪回技术详解
    1闪回技术介绍闪回技术是oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还......
  • NumPy 差分、最小公倍数、最大公约数、三角函数详解
    NumPy差分离散差分意味着相邻元素之间的减法。例如,对于[1,2,3,4],离散差分将是[2-1,3-2,4-3]=[1,1,1]要找到离散差分,使用diff()函数。示例:importnumpyasnparr=np.array([10,15,25,5])newarr=np.diff(arr)print(newarr)返回:[510-20],因为15-......
  • Java数组 详解(初始化 格式 索引 地址值 遍历 …)
    数组什么是数组?数组指的是一种容器可以用来存储同种数据类型的多个值小结:数组指的是一种容器可以用来存储同种数据类型的多个值//数组容器在存储数据的时候需要结合隐式转换考虑//例如int类型的数组容器( byte short int )//例如double类型的数组容器......
  • mysqlconf
    [mysqld]#max_connections=20000#数据传输可能出现大表中断与这个有关系port=13306default-authentication-plugin=mysql_native_password#datadir=/opt/data/mysql/mysql#socket=/opt/data/mysql/mysql/mysql.sockdatadir=/opt/data/mysql/mysql/mysqlsocket=/o......
  • 深入解读Netty中的NIO:原理、架构与实现详解
    深入解读Netty中的NIO:原理、架构与实现详解Netty是一个基于Java的异步事件驱动网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端。Netty的核心是基于JavaNIO(Non-blockingI/O)的,因此理解Netty的实现需要先了解JavaNIO的基本概念和机制。JavaNIO简介Jav......
  • MySQL触发器基本结构
    1、修改分隔符符号delimiiter$$可以修改成$$//都行2、创建触发器函数名称createtrigger函数名3、什么样的操作触发,操作哪个表after:···之后触发before:···之前触发insert:插入被触发update:修改被触发delete:删除被触发on表名实例:在user表被添加信息后触发......
  • 如何解决c++使用mysql数据库读取中文输出时乱码问题
    使用vs写c++输出数据库中文时出现乱码设置utf-8还是不行这是数据库的内容这是输出:在网上找有说改成utf-8的格式,加入这样一句:mysql_query(conn,"setnamesutf8");效果就是这样:发现错误依旧,询问群友后修改,需要在连接数据库的函数中加入如下一句:mysql_query(conn,"set......
  • MYSQL查询语句报1 of ORDER BY clause is not in SELECT list
    我的语句如下:SELECTDISTINCT r.id, r.device_model_id, r.device_model_name, r.alarm_type_id, r.alarm_type_name, r.alarm_level, r.filter_condition, r.filter_condition_value, r.offline_tag, p.param_data_id, p.parmsFROM alarm_ruler, alarm_rule_pa......