当前位置: 首页 > news >正文

【MySQL数据库】约束

在MySQL数据库中,约束(Constraint)是用于限制表中数据的一种规则,目的是为了确保数据的完整性以及一致性。下面我们就从建表时的约束、建表后如何添加约束等几个方面,讲解MySQL中常用的几种约束。

创建时约束

分类

非空约束

非空:关键字为[not null]。用来约束数据的该字段不能设置空值,也就是说,这一列的每个数据都应该有值。

非空约束的特点:

①插入数据时必须给该字段设置值

②修改数据时不能将字段修改为null

create table tbname{
    id int not null,
    -- other
};

唯一约束

唯一:关键字为[unique]。用来约束数据的该字段不因该有重复的值,也就是说,这一列的每个数据都是不一样的。

唯一约束的特点:

①插入数据时,如果设置值,那么不能与该列其它数据一样否则失败。如果不设置值,那么可以为null,如果该列有多个null值,不违反唯一约束(都没有值,怎么判断它们相等呢,是吧)

②修改数据时,如果将null修改为具体的值,那么这个值不能与该列其它数据一致

create table tbname{
    id int unique,
    -- other
};

主键约束

主键:关键字为[primary key]。是唯一标识 表中每一行的 那一列字段的约束。

主键的三个要求:

①每个数据表都应该有一个唯一的主键

②主键不应该被频繁的修改

③为了满足条件二,主键该与业务无关,避免业务的改变带动主键频繁修改。

主键的三个特点:

①唯一性:主键一旦设置,就自动加上了唯一约束

②非空性:主键一旦设置,就自动加上了非空约束

③单一性:即主键最多只能有一个,如果想要有多个字段都作为标识,那么可以使用联合主键的方式将多个字段联合为一个主键。

主键约束中常常与自增约束搭配使用:

自增约束的关键字为:[auto_increment],即每次插入一条新的数据,无需赋值,就可以根据内部的计数器的值设置主键的值。

create table tbname{
    id int primary key auto_increment,
    -- other
};

默认约束

默认:关键字为[default]。是用来约束该字段不设值时,默认给的一个值。如果不约束则是默认null。

默认约束的特点:

就是在插入数据时,如果不插入该字段,该字段的值会根据默认约束的默认值填充。

外键约束

外键:关键字为[foreign key]。外键用于建立表与表之间的关系,确保在一个表中的某列值必须在另一个表中出现。

外键的使用:

create table tbname{
    id int primary key auto_increment,
    userid int foreign key references usertb(id)
};

 拥有外键的表称之为子表(从表),外键关联的表称之为父表(主表)。

子表中拥有外键约束的字段,引用(references)父表中的主键或者唯一键。外键约束确保子表中的每个外键值都在父表中有对应的值。

外键约束的类型:

cascade:如果父表删除行,则所有引用该行的子表行也会被自动删除

set null:如果父表删除行,则所有引用该行的子表行会被设置为NULL

set default:如果父表删除行,则所有引用该行的子表行会被设置为默认值

no action:如果试图删除父表的行而子表中仍有引用,将会抛异常,阻止删除

restrict:与no action相似,但是在删除或更新时,立即检查外键约束,而不是在事务结束时检查

外键使用的注意事项:

①子表的外键约束列的数据类型必须与父表的引用列的数据类型相同

②外键约束会影响增删改,确保外籍值的有效性会导致性能下降

如果子表插入的外键值为空,可以建立,在该表中称为孤儿数据

先建父表,再建子表。

先插入父表数据,再插入子表数据

先删除子表数据,再删除父表数据

先删子表,在删父表

检查约束

检查:关键字为[check]。检查约束是用来确保列中的值符合特定的条件的一种规则。

检查约束的使用:

create table tbname{
    id int primary key auto_increment,
    salary decimal check(salary >= 0)
};

应用

create table mytb(
    id int not null, #非空约束
    name varchar(20) #不设置就是可以为空
);
insert into mytb(name) values("stark");#err-id is not null
insert into mytb(id,name) values(1,"stark");#sucess
#创建时约束
create table mytb(
    id int not null default 123,
    name varchar(20)
);
insert into mytb(name) values("stark");#sucess-id默认为123 -is not null
#创建时约束
create table mytb(
    id int unique,
    nama varchar(20)
);
insert into mytb(id) values(1);#sucess
insert into mytb(id) values(1);#err-上面一条语句已经插入了一个id值为1的记录了

创建后约束

非空约束

#创建后约束
alter table mytb
modify name varchar(20) not null;
#删除约束
alter table mytb
modify name varchar(20) null;

默认约束

#创建后约束
alter table mytb
modify name varchar(20) default "";
#删除约束
alter table mytb
modify name varchar(20) default null;

根据上面的例子,我们呢大概率也清楚了大概的方法,在使用时可以不断地尝试。

表级约束 - 联合主键(键、索引)

#创建时约束:
create table mytb(
    id int,
    name varchar(20)
    [constraint id_name] unique(id, name)
);#[constraint 是为键key or 索引index起别名]
#创建后约束:
alter table mytb
add [constraint id_name] unique(id,name);
    
#删除:
    alter table mytb
    drop key id_name;
    
    alter table mytb
    drop index id_name;

相关文章:

  • Audacity 技术浅析(一)
  • C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)
  • 什么是强哈希算法pbkdf2(Password-Based Key Derivation Function)
  • 算法题(98):大数加法
  • Python桌面应用开发入门:Tkinter+PyQt5实战文件管理器教程
  • 2024华东师范大学计算机复试上机真题
  • Androidstudio实现一个app引导页(超详细)
  • 【电路笔记】-多谐振荡器
  • 2024年12月CCF-GESP编程能力等级认证C++编程六级真题解析
  • Java常用设计模式
  • maven笔记
  • 电子学会—2024年06月青少年软件编程(图形化)二级等级考试真题——绘制图形
  • 如何用Java将实体类转换为JSON并输出到控制台?
  • 每日一题---dd爱框框(Java中输入数据过多)
  • JVM 2015/3/15
  • 《我的Python觉醒之路》之转型Python(十三)——控制流
  • GetCurrentTime
  • 具身系列——零样本倒水任务
  • 基于大模型预测的难治性青光眼诊疗方案研究报告
  • RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)
  • 当文徵明“相遇”莫奈:苏博将展“从拙政园到莫奈花园”
  • 习近平:坚定信心推动高质量发展高效能治理,奋力谱写中原大地推进中国式现代化新篇章
  • 习近平:推进中国式现代化要继续把制造业搞好
  • 在越剧之乡嵊州,浙江音乐学院越剧学院成立
  • 甘肃白银煤矿透水事故仍有3人失联,现场约510立方米煤泥拥堵巷道
  • 长沙至赣州高铁初步设计获批,可填补湘赣两省斜向交通空白