MySQL八大约束

MySQL约束

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

在这里插入图片描述


MySQL约束

概念

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

作用

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

分类

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

主键约束(primary key)

概念

  1. MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。
  2. 主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。
  3. 每个表最多只允许一个主键
  4. 主键约束的关键字是:primary key
  5. 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

操作

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

方式1-语法

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

方式1-实现

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(id)
);
  • 添加多列联合主键
    所谓的联合主键,就是这个主键是由一张表中多个字段组成的。
    注意:
    当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
    一张表只能有一个主键,联合主键也是一个主键

语法

create table 表名(...primary key (字段1,字段2,…,字段n)
);

实现

create table emp3( name varchar(20), deptId int, salary double, primary key(name,deptId) );
  • 通过修改表结构添加主键
    主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。

语法

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);
  • 删除主键
    一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。

语法

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

实现

-- 删除单列主键 
alter table emp1 drop primary key;
-- 删除联合主键 
alter table emp5 drop primary key;

自增长约束(auto_increment)

概念

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

特点

  • 默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
  • 一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
  • auto_increment约束的字段必须具备 NOT NULL 属性。
  • auto_increment约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等。
  • auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。

操作

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

语法

字段名 数据类型 auto_increment

方式1

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

方式2

-- 方式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数据之后自动增长从默认起始值开始

非空约束(not null)

概念

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

操作

语法

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

添加非空约束

-- 方式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) ;

唯一约束(unique)

概念

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

操作

语法

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

添加唯一约束

-- 方式一
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;

默认约束(default)

概念

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

操作

语法

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

添加默认约束

--方式一
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;

零填充约束(zerofill)

概念

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

操作

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

删除零填充约束

alter table t_user12 modify id int;

外键约束(foreign key)

概念

  • 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

特点

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。
  • 必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这 个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同。
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

操作

语法

--方式一
[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]
--方式二
alter table <数据表名> add constraint <外键名> foreign key(<列名>) >references <主表名> (<列名>);

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

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

相关文章

ASP.NET使用管道模型(PipleLines)处理HTTP请求

大多数人认为ASP.NET仅仅只是页面——使用模板来创建HTML页面然后返回给浏览器。但是这仅仅只是ASP.NET使用HTTP管道模型处理WEB程序很小的一方面。管道模型是类似于Web Services的一种在服务器端处理ASP.NET页面的框架技术。作为一名高级的ASP.NET的开发者&#xff0c;你必须清…

【LeetCode-SQL每日一练】——1.组合两个表

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦梦梦梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好…

【LeetCode-SQL每日一练】——2. 第二高的薪水

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好SQL&am…

【LeetCode-SQL每日一练】—— 181. 超过经理收入的员工

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好SQL&am…

【windows环境——VSCode安装教程】

大家好呀&#xff01;我是超梦&#xff0c;今天给小伙伴们带来一个最新版在windows环境的VSCode安装教程&#xff0c;话不多说我们开始吧。 VSCode安装下载与安装设置中文环境下载与安装 1. 第一步&#xff0c;进入官网&#xff0c;根据自己的电脑位数选择下载&#xff0c;小梦…

C#通用类Helper整理

★前言 最近下载了tita_chou在CSDN上传的一个资源&#xff0c;是在工作中整理的C#帮助类&#xff0c;里面包含了很多实用的类&#xff0c;想到我之前收集过自己用到少的可怜的类&#xff0c;心生敬意啊。当粗略的查看了那个资源&#xff0c;发现有一些是重复的&#xff0c;有一…

【LeetCode-SQL每日一练】—— 182. 查找重复的电子邮箱

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟【数据库】打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL【知识储备】是必不可少的。想要掌握…

【你会用代码画年兽吗】20行代码使用JS实现虎年春节倒计时 —— 红红火火过虎年

&#x1f34a;前言 &#x1f34a;哈喽小伙伴们好呀&#xff0c;我是超梦&#xff0c;大家可以叫我小梦~&#xff0c;马上就要过虎年春节啦&#xff0c;在新的一年里祝愿大家&#x1f42f;身体健康&#xff0c;&#x1f42f;平平安安&#xff0c;&#x1f42f;虎气冲天&#xf…

【LeetCode-SQL每日一题】——183. 从不订购的客户

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好SQL&am…

c#进阶(1)—— Task Parallel Library 并行执行与串行执行

本文参考的博文出处&#xff1a;http://www.cnblogs.com/stoneniqiu/p/4857021.html 总体说明&#xff1a; &#xff08;1&#xff09;、理解硬件线程和软件线程 硬件线程也称为逻辑内核&#xff0c;一个物理内核可以使用超线程技术提供多个硬件线程。所以一个硬件线程并不代…

【leetcodeMySQL每周一练】- 5道题带你练习mysql

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的。想要掌握好SQL&am…

【读书笔记】.Net并行编程高级教程--Parallel

一直觉得自己对并发了解不够深入&#xff0c;特别是看了《代码整洁之道》觉得自己有必要好好学学并发编程&#xff0c;因为性能也是衡量代码整洁的一大标准。而且在《失控》这本书中也多次提到并发&#xff0c;不管是计算机还是生物都并发处理着各种事物。人真是奇怪&#xff0…

【除夕最炫烟花代码】—— HTML+JQuery实现2022跨年烟花特效

&#x1f387;前言 大家好呀&#xff01;我是小梦是✨。 除夕马上到来&#xff0c;激动的心颤动的手&#xff01;今年由于管控严厉&#xff0c;许多地方禁止燃放烟花爆竹&#xff0c;既然不让我们放&#xff0c;那我们就用代码来实现烟花特效&#xff01; 文末有彩蛋哦~ 烟花效…

【LeetCode-SQL每日一练】—— 595. 大的国家

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。大家可以叫我小梦~ 小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的…

c#进阶(2)—— ASP.NET MVC 常用路由总结

1、URL模式 路由系统用一组路由来实现它的功能&#xff0c;这些路由共同组成了应用系统URL架构或方案&#xff0c;这种URL架构是应用程序能够识别并能对之做出响应的一组URL&#xff0c;当处理一个输入 请求时&#xff0c;路由系统的工作是将这个请求URL与一个模式进行匹配&am…

【爱心代码大全】——情人节表白代码送给她属于我们程序员的浪漫

&#x1f474;大多数人以为的程序员——发量少&#xff0c;身穿格子褂&#xff0c;坐在电脑前就是码字。一点也不懂浪漫&#xff01; 谁说我们不懂浪漫的&#xff1f; 不&#xff01; 你错了 程序员一旦浪漫起来&#xff0c;真没其他人啥事了&#xff01;&#xff01;&#xff…

c#进阶(4)—— Redis 用于消息队列的存储

1、参考的博文 a : http://www.cnblogs.com/lori/archive/2012/04/12/2443708.html —— 主要的实现思路 b: http://www.cnblogs.com/liqingwen/archive/2017/04/06/6672452.html —— RedisHelper 类 c : https://www.cnblogs.com/stopfalling/p/5375492.html —— 应用场…

【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。大家可以叫我小梦~ 小伙伴们都知道&#xff0c;不管是在学习中还是日常工作中&#xff0c;几乎天天是要跟数据库打交道的&#xff0c;为了更好的操作数据库&#xff0c;我们的SQL知识储备是必不可少的…

【情人节表白代码】——情人节将至,10余款浪漫爱心特效送给你爱的那个她

谁说我们不懂浪漫的&#xff1f; 不&#xff01; 你错了 程序员一旦浪漫起来&#xff0c;那就是个bug&#xff01;&#xff01;&#xff01; 浪漫表白一 代码部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/…

c#进阶(6)—— 网络通信基础知识

1、HttpClient 类 (1)、HttpClient 类 用于发送HTTP 请求&#xff0c;接收请求的响应。 (2)、HttpClient 类 派生于 HttpMessageInvoker类&#xff0c;此基类负责执行 SendAsync(),SendAsync() 方法调用是异步的&#xff0c;可以编写一个完全异步的系统来调用Web服务。 2、实…