mysql基础之约束

在mysql中null和任何值都不相同,null和null也不相同

1.约束简介

1.1概念

约束英文:constraint
约束实际上就是表中数据的限制条件

1.2.作用

表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。

1.3.分类

  • 主键约束(primary key) PK
  • 自增长约束(auto_increment)
  • 非空约束(not null)
  • 唯一性约束(unique)
  • 默认约束(default)
  • 零填充约束(zerofill)
  • 外键约束(foreign key) FK

2.约束分类的具体介绍

2.1 主键约束

2.1.1 概念
  1. MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。

  2. 主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。

  3. 每个表最多只允许一个主键

  4. 主键约束的关键字是:primary key

  5. 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

2.1.2 操作
  • 添加单列主键
  • 添加多列主键
  • 删除主键
1. 添加单列主键

创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键

  • 方式1-语法
-- 在 create table 语句中,通过 PRIMARY KEY 关键字来指定主键。
--在定义字段的同时指定主键,语法格式如下:
create table 表名(...<字段名> <数据类型> primary key ...
)

方式一的实现

create table emp1(eid int primay key,name VARCHAR(20),deptId int,salary double
);
  • 方式2-语法
--在定义字段之后再指定主键,语法格式如下:
create table 表名(...[constraint <约束名>] primary key [字段名]
);

方式2-实现:

create table emp2(eid INT,name VARCHAR(20),deptId INT,salary double,constraint  pk1 primary key(eid));
2.添加多列主键(联合主键)

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
注意:

  1. 当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
  2. 一张表只能有一个主键,联合主键也是一个主键
    语法:
create table 表名(...[constraint <约束名>] primary key (字段1,字段2,…,字段n)
);

实现

create table emp3( name varchar(20), deptId int, salary double, constraint pk1  primary key(name,deptId) 
);

注意:联合主键的每一个列都不能为空

3.通过修改表结构添加主键(单列或者联合都可以)

主键约束不仅可以在创建表的同时创建,也可以在修改表时添加
语法

create table 表名(...
);
alter table <表名> add primary key(字段列表);

实现

-- 添加单列主键
create table emp4(eid int, name varchar(20), deptId int, salary double, 
);
alter table emp4 add primary key(eid);
4.删除主键约束

一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。
格式

alter table <数据表名> drop primary key;

实现

-- 删除单列主键 
alter table emp1 drop primary key;-- 删除联合主键 
alter table emp5 drop primary key;
自我小总结

一张表只能有一个主键,primary key其实就是 not null和unique的结合体
主键分为单列主键和联合主键(多个字段组成)

2.2 自增长约束

2.2.1 概念

在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
通过给字段添加 auto_increment 属性来实现主键自增长

2.2.2 语法

字段名 数据类型 auto_increment

2.2.3操作
create table t_user1( id int primary key auto_increment, name varchar(20) 
);
2.2.4特点
  1. 默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
  2. 一个表中只能有一个字段使用 auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
  3. auto_increment约束的字段必须具备 NOT NULL 属性。
  4. auto_increment约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等。
  5. auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
2.2.5 指定自增长字段初始值

如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加

-- 方式1,创建表时指定
create table t_user2 ( id int primary key auto_increment, name varchar(20)
)auto_increment=100;

插入数据

INSERT INTO t_user2 VALUES(1,'11');
INSERT INTO t_user2 VALUES(NULL,'12');
INSERT INTO t_user3 VALUES(NULL,'13');

结果
在这里插入图片描述

-- 方式2,创建表之后指定
create table t_user3 ( id int primary key auto_increment, name varchar(20)
);alter table t_user2 auto_increment=100;

delete和truncate在删除后自增列的变化

  1. delete数据之后自动增长从断点开始
  2. truncate数据之后自动增长从默认起始值开始
自我小总结

自增长只能应用于是整数类型是主键的字段(auto_increment必须和primary key一起出现)
一个表只能有一个主键对应也就是只能有一个自增长约束

2.3 非空约束(not null)

2.3.1 概念

MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。

2.3.2 语法
方式1<字段名><数据类型> not null;
方式2alter table 表名 modify 字段 类型 not null;

添加非空约束-方式1

-- 方式1,创建表时指定
create table t_user6 ( id int , name varchar(20) not null, address varchar(20) not null 
);

应用
在这里插入图片描述

添加非空约束-方式2

create table t_user7 ( id int , name varchar(20) , -- 指定非空约束 address varchar(20) -- 指定非空约束 
); 
alter table t_user7 modify name varchar(20) not null; 
alter table t_user7 modify address varchar(20) not null;

删除非空约束

-- alter table 表名 modify 字段 类型 
alter table t_user7 modify name varchar(20) ; 
alter table t_user7 modify address varchar(20) ;

查看约束

desc 表名

2.4唯一约束

2.4.1 概念

唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。

2.4.2 语法
方式1<字段名> <数据类型> unique
方式2alter table 表名 add constraint 约束名 unique();
2.4.3 操作

方式一

-- 创建表时指定
create table t_user8 ( id int , name varchar(20) , phone_number varchar(20) unique -- 指定唯一约束 
);

方式二

create table t_user9 ( id int , name varchar(20) , phone_number varchar(20) -- 指定唯一约束 
); 
alter table t_user9 add constraint unique_ph unique(phone_number);

删除唯一约束

-- alter table <表名> drop index <唯一约束名>;
alter table t_user9 drop index unique_ph;

注意:

INSERT INTO t_user9 VALUES(1,"www",NULL)
INSERT INTO t_user9 VALUES(2,"wwxw",NULL)

不会报错因为在mysql中null和任何值都不想等,包括其本身

2.5 默认约束

2.5.1概念

MySQL 默认值约束用来指定某列的默认值。

2.5.2语法
方式1<字段名> <数据类型> default <默认值>;
方式2: alter table 表名 modify 列名 类型 default 默认值; 
2.5.3操作

创建默认约束方式一

create table t_user10 ( id int , name varchar(20) , address varchar(20) default ‘北京’ -- 指定默认约束 
);

创建默认约束方式二

-- alter table 表名 modify 列名 类型 default 默认值; create table t_user11 ( id int , name varchar(20) , address varchar(20)  
);
alter table t_user11 modify address varchar(20) default  ‘北京’;

删除约束

-- alter table <表名> modify column <字段名> <类型> default null; alter table t_user11 modify column address varchar(20) default null;

注意:
默认约束以insert手动插入的数据为优先,即使数据为null

2.6 零填充约束

2.6.1 概念
  1. 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
  2. 2.zerofill默认为int(10)
  3. 当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128–+127,无符号为0~256。
2.6.2语法

创建零填充约束

create table t_user12 ( id int zerofill , -- 零填充约束name varchar(20)   
);

删除

alter table t_user12 modify id int;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/212318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose部署sonarqube 8.9 版本

官方部署文档注意需求版本 所以选择8.9版本 一、准备部署配置 1、持久化目录 rootlocalhost:/root# mkdir -p /data/sonar/postgres /data/sonar/sonarqube/data /data/sonar/sonarqube/logs /data/sonar/sonarqube/extensions rootlocalhost:/root# chmod 777 /data/sona…

「Swift」类淘宝商品瀑布流展示

前言&#xff1a;需要做一个类似于淘宝商品页面的瀑布流展示 结构分析&#xff1a; ps&#xff1a;图片来源 思路分析&#xff1a; 该瀑布流主要还是基于UICollectionView进行展示&#xff0c;只是在cell展示的UICollectionViewFlowLayout需要进行相应调整和自定义&#xff…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

python技术栈之单元测试中mock的使用

什么是mock&#xff1f; mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试&#xff0c;需要虚拟某些特定对象以便测试…

[node] Node.js的Web 模块

[node] Node.js的Web 模块 什么是 Web 服务器&#xff1f;Web的应用架构http使用方式使用 Node 创建 Web 服务器使用 Node 创建 Web 客户端 什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器…

使用WalletConnect Web3Modal v3 链接钱包基础教程

我使用的是vueethers 官方文档&#xff1a;WalletConnect 1.安装 yarn add web3modal/ethers ethers 或者 npm install web3modal/ethers ethers2.引用 新建一个js文件&#xff0c;在main.js中引入&#xff0c;初始化配置sdk import {createWeb3Modal,defaultConfig, } from…

Vue3 Element-Plus 一站式生成动态表单:简化前端开发流程

文章目录 1. 引言2. Vue3 和 Element-Plus 简介2.1 Vue32.2 Element-Plus 3. 动态表单的需求与挑战4. Vue3 和 Element-Plus 动态表单的优势4.1 Vue3的组合式API4.2 Element-Plus的表单组件 5. 一站式生成动态表单的实现5.1 准备工作5.2 创建动态表单组件5.3 使用动态表单组件 …

uniapp横向滚动示例

目录 插件市场案例最后 插件市场 地址 案例 地址 最后 感觉文章好的话记得点个心心和关注和收藏&#xff0c;有错的地方麻烦指正一下&#xff0c;如果需要转载,请标明出处&#xff0c;多谢&#xff01;&#xff01;&#xff01;

读书笔记-《数据结构与算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通过构建有序序列&#xff0c;对于未排序序列&#xff0c;在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历)&#xff0c;找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始&#xff0c;该元素可…

Science | 张锋实验室:聚类算法揭示188种新型CRISPR系统

微生物序列数据库包含大量有关酶和其他可用于生物技术的分子的信息。但近年来&#xff0c;这些数据库已经变得非常庞大&#xff0c;以至于很难有效地搜索到感兴趣的酶。 2023年11月23日&#xff0c;博德研究所张锋及美国国立卫生研究院Eugene V. Koonin共同通讯在Science 在线…

【原神游戏开发日志1】缘起

【原神游戏开发日志1】缘起 版权声明 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明 文章内容不得删减、修改、演绎 相关学习资源见文末 大家好&#xff0c;最近看到原神在TGA上频频获奖&#xff0c;作为一个14年经验的游戏开…

C# Solidworks二次开发:三种获取SW设计结构树的方法-第一讲

今天要讲的方法是如何在Solidworks中获取左侧设计结构上的节点&#xff0c;获取节点的方法我所知道的有三种。 这三种方法满足我在使用过程的多种需求&#xff0c;下面先开始介绍第一个方法&#xff1a; 方法的API如下所示&#xff1a;GetComponents Method (IAssemblyDoc) 这…

基于单片机的电子密码锁设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的电子密码锁&#xff0c;可设置四位密码&#xff0c;输入错误三次&#xff0c;报警灯亮起&#xff08;红灯亮起&#xff09;&#xff0c;输入正确&#xff0c;绿灯闪烁三次。可通过LCD显示屏查看密码&…

Canvas鼠标画线

鼠标按下开始画线,鼠标移动根据鼠标的轨迹去画,鼠标抬起停止画线 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路&#xff1a;从左小角或者右上角开始遍历&#xff0c;假设右上角开始遍历&#xff0c;如果当前值大于目标值则列-1&#xff1b;如果当前值小于目标值则行1&#xff0c;以此遍历来查找目标值&#xff1b;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

选择黑盒测试用例设计方法的综合策略方案总结

前言 具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景法等。这些方法都是比较实用的&#xff0c;但在具体工作中要采用什么方法&#xff0c;需要针对项目的特点加以适当的选择。在实际高水平…

在 Windows 桌面的redis中远程连接到 VMware 中运行的 Linux 上的 Redis

先修改一下docker容器中的redis(一会连上之后看效果) 我使用的是VMware的虚拟机 选择的网络设置为桥接模式 查到虚拟机独立的ip是如下 允许 Linux 虚拟机上的 Redis 监听外部连接&#xff1a; 打开 Linux 虚拟机上的 Redis 配置文件。在大多数系统上&#xff0c;配置文件位于…

java设计模式学习之【桥接模式】

文章目录 引言桥接模式简介定义与用途&#xff1a;实现方式 使用场景优势与劣势桥接模式在Spring中的应用绘图示例代码地址 引言 想象你正在开发一个图形界面应用程序&#xff0c;需要支持多种不同的窗口操作系统。如果每个系统都需要写一套代码&#xff0c;那将是多么繁琐&am…