mysql中 唯一约束的关键字是_mysql的约束

在mysql设计表中,有个概念叫做约束

什么是约束

约束英文:constraint

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

约束种类

mysql的约束大概分为以下几种:非空约束(not null)

唯一性约束(unique)

主键约束(primary key) PK

外键约束(foreign key) FK

检查约束(目前MySQL不支持、Oracle支持,本文不做介绍)

为了能继续看下去,打开mysql,创建了一个表:create table `test`

(

`id` int auto_increment primary key , ## 主键约束

`name` varchar(64) not null unique , ## 非空约束+唯一性约束

`password` varchar(64) not null default '', ## 非空约束

`age` tinyint(3) default 0,## 没有约束

`add_time` datetime ## 没有约束

)engine =InnoDb

charset = 'utf8';

在这个创建语句中,我们使用到了3种约束(非空约束,主键约束,唯一性约束);在后面会使用到外键约束

非空约束

非空约束是我们最常见的一种约束方式,它规定了我们插入数据不允许为空(在mysql中,''不是空,null才是),例如以下插入语句:insert into `test`(`name`,`password`)value ('test','123456');## 插入成功

insert into `test`(`name`,`password`)value ('test2',null);## password不能为null

insert into `test`(`name`)value ('test3');## 插入成功,password虽然有约束,但是有default '',当未指定password值时,默认为''

insert into `test`(`name`)value ('test');## 唯一性约束,test已经存在

5e63815dae613a1b20e8a17e88860af3.png

应用场景方面,例如用户邮箱,用户密码不能为空,都可以增加非空约束

唯一性约束

唯一性约束是使用unique关键字进行的约束,它有多种约束方式以及约束形式.

单字段约束

列级直接约束:create table `unique_test1`(

`id` int(11) auto_increment primary key ,

`name` varchar(64) unique

)

表级约束:create table `unique_test1`(

`id` int(11) auto_increment primary key ,

`name` varchar(64),

unique (`name`)

)

constraint 关键字约束:create table unique_test1

(

id   int auto_increment

primary key,

name varchar(64) null,

constraint name

unique (name)

);

以上三种语句最后实现的都是一样的功能

当插入相同的name时,则会报错:insert into `unique_test1` (`name`)values ('仙士可'),('仙士可');

77a12291af87d194469cce665ce4b7a9.png

表级多字段约束

我们可以约束多个表字段,来进行联合约束create table `unique_test2`(

`id` int(11) auto_increment primary key ,

`name` varchar(64) not null,

`email` varchar(64),

`add_time` datetime,

unique `name_email`(`name`,`email`) ## 前面的是约束别名,后面的是约束字段

)

同时也可以使用constraint 关键字约束:create table unique_test2

(

id       int auto_increment

primary key,

name     varchar(64) not null,

email    varchar(64) null,

add_time datetime    null,

constraint name_email

unique (name, email)

);

作用都是相同的,

插入数据时,插入同样的name是没有问题的,只有当name+email都相同才会出现问题:insert into `unique_test2` (`name`, `email`, `add_time`)

values ('仙士可', '1067197739@qq.com', '2018-12-01'),

('仙士可', '1067197740@qq.com', '2018-12-01');## 相同name不会出错

insert into `unique_test2` (`name`, `email`, `add_time`)

values ('仙士可1号', '1067197739@qq.com', '2018-12-01'),

('仙士可2号', '1067197739@qq.com', '2018-12-01');## 相同email也不会出错

insert into `unique_test2` (`name`, `email`, `add_time`)

values ('仙士可', '1067197739@qq.com', '2018-12-01'),

('仙士可1号', '1067197739@qq.com', '2018-12-01');## 相同name+email将出错

9b501c7b2a56688c49c75b65f09e45fd.png

我们也可以在一个表内unique多个字段,让name or email都不允许重复,直接写着3种实现方式:create table `unique_test_3`(

`id` int(11) auto_increment primary key ,

`name` varchar(64) unique ,

`email` varchar(64) unique ,

`add_time` datetime

);

create table `unique_test_3`(

`id` int(11) auto_increment primary key ,

`name` varchar(64) ,

`email` varchar(64) ,

`add_time` datetime,

unique `name_alias` (`name`),

unique `email_alias` (`email`)

);

create table unique_test_3

(

id       int auto_increment

primary key,

name     varchar(64) null,

email    varchar(64) null,

add_time datetime    null,

constraint email

unique (email),

constraint name

unique (name)

);

这样的话,只要是插入相同的name或者插入相同的email都将出错:insert into `unique_test_3` (`name`, `email`, `add_time`)

values ('仙士可', '1067197739@qq.com', '2018-12-01'),

('仙士可', '1067197740@qq.com', '2018-12-01');##相同name将出错

insert into `unique_test_3` (`name`, `email`, `add_time`)

values ('仙士可2号', '1067197739@qq.com', '2018-12-01'),

('仙士可1号', '1067197739@qq.com', '2018-12-01');##相同email将出错

12ee91adaa1206509b22691e637c4345.png

主键约束

关于主键约束

表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值.

表中每一行都应该有可以唯一标识自己的一列(或一组列)。

一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号。

主键(primary key) 一列(或一组列),其值能够唯一区分表中的每个行。

唯一标识表中每行的这个列(或这组列)称为主键。

没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。

在我们平时开发中,大部分情况会给表增加一个'id'的主键,用于标识一行数据

主键也是唯一性约束,一个表中不允许出现2条相同的主键信息

一般情况下,'id'主键会设置成自增(auto_increment)

无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)

例如:create table `unique_test_4`(

`id` int primary key ,

`name` varchar(64),

`email` varchar(64)

) engine =INNODB charset ='utd8';## 单一主键

create table `unique_test_4`(

`id` int,

`name` varchar(64),

`email` varchar(64),

primary key `id_name`(`id`,`name`)

) engine =INNODB charset ='utd8';## 表级定义复合主键

create table `unique_test_4`(

`id` int,

`name` varchar(64),

`email` varchar(64),

constraint `id_name` primary key (`id`,`name`)

)engine =INNODB charset ='utd8';## constraint 关键字复合主键

主键的约束和唯一性约束性质差不多,这里就不多做介绍了

外键约束

若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。

当表A想要删除一条记录时,必须先将表B的数据删除(如果表B有数据),否则会报错

例如:create table member

(

id       int auto_increment

primary key,

name     varchar(64) default '' null,

password varchar(64) default '' null,

add_time datetime               null

)

engine = InnoDB;

create table member_point

(

id        int auto_increment

primary key,

member_id int default 0 null,

point     int default 0 null,

constraint con_member_id

foreign key (member_id) references member (id)

)

engine = InnoDB;

## 插入数据

insert into `member` (`name`, `password`, `add_time`)

values ('仙士可','123456','20181225'),

('仙士可1号','654321','20181212'),

('仙士可2号','111111','20181201');

insert into `member_point` (`member_id`,`point`) values

(1,'100'),

(2,'96'),

(3,'80');

当删除member表id等于1(member_point存在member_id=1数据)的数据,和插入member表不存在的数据时,会报错:DELETE FROM `test`.`member` WHERE `id` = 1;

insert into `member_point` (`member_id`,`point`) values

(100,'100')

712e19170be975500cdd4c2b44165c55.png

0296b8bfd2dc7f69f3c58b9a80a4b932.png

注意:外键值可以为null

外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束(主键也算是unique约束)

有了外键引用之后,表分为父表和子表member表:父表

member_point表:子表

创建先创建父表

删除先删除子表数据

插入先插入父表数据

外键约束将会让mysql在插入,删除,更新会增加额外的判断,严格来说,不允许使用外键约束,如果需要限制,请在代码层限制

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

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

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

相关文章

叉乘点乘混合运算公式_小学36年级必须掌握的数学公式和概念口诀,替孩子收藏一下!...

小学数学需要记住的知识点还是比较多的,看到这些知识点,很多孩子都觉得枯燥,不愿意用心去记。如果我们把一种新的、有趣的记忆方法教给孩子,孩子也会变得有兴趣,因为兴趣是最好的老师。一、20以内进位加法看大数&#…

python图像数独_Python图像识别+KNN求解数独的实现

Python-opencvKNN求解数独最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s。整体思路大概就是识别出图中数字生成list,然后求解。输入输出demo数独采用的是微软自带的Microsoft sudoku软件随便截取的图像,…

上位机与1200组态步骤_西门子1200的HSC的应用实例!

高速计数器寻址CPU 将每个高速计数器的测量值,存储在输入过程映像区内,数据类型为 32 位双整型有符号数,用户可以在设备组态中修改这些存储地址,在程序中可直接访问这些地址,但由于过程映像区受扫描周期影响&#xff0…

cmd代码表白_手把手教你把Python代码转成exe

【文末有福利】很多刚入门的盆友都有疑惑怎么把Python代码转成可执行的exe?,这里行哥统一解决一下这个问题1.在cmd里安装pyintsaller包2.在cmd里输入打包成exe的命令3.问题总结4. pyintsaller --help5. end1.在cmd里安装pyintsaller包第一步安装将Python…

searchview 点击后被覆盖_03实战Jacoco统计代码覆盖

本篇内容主要介绍:在gradle项目中添加jacoco来了解工程的代码覆盖情况。自动化的统计代码覆盖情况,有助于将焦点问题可视化,从而决定什么时候采取什么动作进行改进。Jacoco可以方面的添加在测试执结束,进行代码覆盖率的统计。如果…

电脑功耗软件_台式电脑配置详解!

近期有许多做设计的朋友问我,怎么配一台工作用的电脑,今天就给大家介绍一下电脑的各个组成部分。电脑核心配置,一般指CPU、主板、显卡三大件,一般笔记本电脑不需要考虑主板,只需考虑CPU和显卡两大件。1.CPU的选择现在的…

spring定时器突然不执行了_非标自动化设备之PLC定时器的时间和程序扫描周期

扫描周期是PLC本身执行指令时的周转时间。PLC执行指令按梯形图是从左向右,从上到下执行。每执行一遍就顺便扫描一遍所有元件状态并按指令执行相应动作。这个是需要时间吧,把这个时间叫扫描周期。并如此无限循环下去。当然扫描周期越短,PLC性能…

python入门小游戏之跳一跳_从零基础开始,用python手把手教你玩跳一跳小游戏,直接打出高分...

这对于很多人来说,可能是已经过时的游戏,但是对于python入门来说,却是一个非常值得学习的项目。TONOW收集了很多有关python入门的项目案例,包含了相应的教程和源码,哪怕你从未接触编程,也通过这些教程&…

如何反映两条曲线的拟合精度_用水平仪如何检测导轨的直线度?

1、水平仪的原理及用途: 气泡型水平仪的水准管是由玻璃制成,水准管内壁是一个具有一定曲率半径的曲面,管内装有液体,当水平仪发生倾斜时,水准管中气泡就向水平仪升高的一端移动,从而确定水平面的…

嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货

一、什么是 ES Nested 嵌套Elasticsearch 有很多数据类型,大致如下:基本数据类型: string 类型。ES 7.x 中,string 类型会升级为:text 和 keyword。keyword 可以排序;text 默认分词,不可以排序。…

c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计

1. 基于proteus的51单片机开发实例30-模块化程序设计1.1. 实验目的模块化程序设计不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什么呢?我们先从程序结构开始吧。总结在前面的29…

反序列化的时候出现eof exception_FastJson序列化时候出现了$ref?还不赶紧学习下...

最近在使用fastjson时候遇到一个问题,后台的数据转化为json字符串后发送到前端时候出现了$ref字样的东西,后来明白了这是引用,下面详细介绍下。一、一个简单的例子先来上一段代码,运行后打印的结果可能出乎意料,代码如…

阿里云 linux mysql数据库_Linux Mysql数据库安全配置

Linux Mysql数据库安全配置目录:1.修改mysql管理员账号root的密码(2种方法)2.修改mysql管理员账号root3.mysql管理员root账号密码遗忘解决办法(2种方法)4.创建数据库用户(3种方法)5.mysql数据库权限管理本地权限网络权限撤销权限删除用户一、修改mysql管理员账号roo…

快速锁屏电脑快捷键_一学就会的8个电脑快捷键一定要掌握!堪称“高效”神器...

日常工作中,电脑是我们常用的设备,为了提高工作效率常常需要牢记一些电脑快捷键,那么有哪些电脑快捷键值得我们牢记呢?下面分享8个实用的电脑快捷键,关键时刻省时又省力哟!#1 WindowsL 快速锁屏一般用在暂时…

left join 重复数据_Python数据分析整理小节

一、数据读取1、读写数据库数据读取函数:pandas.read_sql_table(table_name, con, schemaNone, index_colNone, coerce_floatTrue, columnsNone)pandas.read_sql_query(sql, con, index_colNone, coerce_floatTrue)pandas.read_sql(sql, con, index_colNone, coerce_floatTrue,…

win10文件显示后缀名_Win10一开机,内存占用竟高达60%?你可以尝试这样做

说到win10一开机,内存占用竟高达60%,你是怎么处理的呢?深受其害的朋友就此大展身手了,瞅瞅!A:我16G内存,也是开机占用了70%多。百度找了很多方法都是不相关的答案,后来发现了关闭快速…

LSTM(长短期记忆网络)的设计灵感和数学表达式

1、设计灵感 LSTM(长短期记忆网络)的设计灵感来源于传统的人工神经网络在处理序列数据时存在的问题,特别是梯度消失和梯度爆炸的问题。 在传统的RNN(循环神经网络)中,信息在网络中的传递是通过隐状态向量进…

个人博客代码_Jekyll + Github Pages 搭建个人免费博客

今天亲手通过 Jekyll 搭建了一套免费博客,搭建步骤其实超级简单。你不需要购买域名,也不需要购买服务器,就可以轻松拥有你自己的博客。Jekyll 的核心是一个文本转换引擎。它的方便之处在于支持多种文本标记语言:Markdown&#xff…

js计算排名_今天,我们讲一下,快速排名与黑帽SEO

做个有心人(第7篇)在Web3.0时代,想要获得流量,就必须使用广告手段,用什么广告手段,需要切合自身情况来做,比如说:SEO是免费的,而SEM就是付费的。而SEO快速排名是什么鬼?真的快吗?快速排名究竟…

黑马h5学习代码_如何零基础制作酷炫实用的H5页面

H5页面已经成为了当下移动端主要的宣传方式,一个好的H5页面有极高的营销价值,无论是企业还是个人都非常需要。制作一个炫酷的H5页面一定要会写代码吗,下面千锋网络营销小编就给大家分享如何零基础制作炫酷实用的H5页面。支持H5的Web APP迅猛发展很重要的一点就是APP中的内容产生…