【MySQL-约束篇】

2023-11-13

1、空值(Null)

先看一个表结构。

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(11) | YES  |     | NULL    |       |
| password | varchar(11) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

该表中的id、name、password字段都允许为空值。
插入一个数据

insert into aaaa values (3,"猫爷");
+------+--------+---------+
| id   | mingzi | pssword |
+------+--------+---------+
|    1 | 猫爷   | 123456  |
|    2 | 狗哥   | 654321  |
|    3 | 猫爷   | NULL    |
+------+--------+---------+

其中,第三行猫爷的password字段为空。

在创建表的时候,我们可以设置字段不为空。在使用表的时候,如果有业务要求可以为空,我们就可以不设置空值,之外我们最好都设置字段不能为空。

数据库是用来管理数据的,他对数据的管理很苛刻,其中是否为空就是数据库对数据的一种约束,只要对数据约束的够好,出现的错误就越少,在使用的时候也更加轻松。

create table bbbb(
	id int not null,
	name varchar(11) not null
);

desc bbbb;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(11) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

这时候如果漏了一个字段不填数据,就会报错,数据库不允许不守规则的数据进入。

2、默认值

看表结构

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(11) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

表中默认值为空。默认值也是一种约束,插入一条记录时,某字段没有数据插入,该字段就会插入默认值。

创建一个新表cccc

create table cccc( 
	id int not null,
	name varchar(11) default "三毛",  
	age enum('男','女') default '男'
)charset=utf8;

desc cccc;
+-------+-------------------+------+-----+---------+-------+
| Field | Type              | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| id    | int(11)           | NO   |     | NULL    |       |
| name  | varchar(11)       | YES  |     | 三毛    |       |
| age   | enum('男','女')   | YES  |      ||       |
+-------+-------------------+------+-----+---------+-------+

插入几条记录

insert into cccc (id,name) values (1,"陈平安");
insert into cccc (id) values (2);
insert into cccc (id,age) values (3,'女');

+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | 陈平安     ||
|  2 | 三毛       ||
|  3 | 三毛       ||
+----+-----------+------+

3、主键

主键是用来唯一标识数据库的一个字段的数据,不能重复不能为空

如何设置主键:

create table dddd(
		id int primary key comment '唯一标识',
		name varchar(11) default '三毛'
)charset=utf8;
  • 删除主键 alter table 表名 drop primary key
  • 追加主键 alter table 表名 add primary key(字段列名)

复合主键
有一些业务需求,一个单独的字段无法标识一段数据。
比如我们标识一个进程,是用ip地址和端口号来共同标识的。

create table eeee(
		ip varchar(33) primary key comment 'IP地址',
		port int primary key comment '端口号'
	);
  • 当插入一条ip和post已经存在的记录时就会报错。两个主键一起标识。
insert into eeee values ('127.0.0.1',8000);
插入成功
insert into eeee values ('127.0.0.1',8001);
插入成功
insert into eeee values ('192.0.0.3',8001);
插入成功
insert into eeee values ('127.0.0.1',8000);
插入失败

4、自增

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

一搬设置主键的时候会给一个自增属性

mysql> create table tt21(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );

mysql> desc aa;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

mysql>
insert into tt21(name) values('a');
mysql> insert into tt21(name) values('b');
mysql> select * from tt21;
+----+------+
| id | name |
+----+------+
| 1  | a    |
| 2  | b    |
+----+------+

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

5、唯一键

唯一键和主键有一点类似,都是不许字段中的数据重复。
一张表中,主键的选取一般情况下是都是与业务无关的字段,但表中的字段也有一些具有唯一属性,我们也不能把他设置成主键,故可以把这些字段设置成唯一键。

create table students(
	id int primary key comment "表的主键",
	name varchar(11) not null comment "学生名字",
	phone varchar(11) unique comment "学生的电话号码",
	identity varchar(18) unique comment "身份证号"
);

关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复

mysql> desc students;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| name    | varchar(13) | NO   |     | NULL    |       |
| phone   | varchar(11) | YES  | UNI | NULL    |       |
| dentity | varchar(18) | YES  | UNI | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
创建成功。。。。。。。。
insert into students values (1,"王二","12345678","111111111111111111");
插入成功
insert into students values (2,"王二","123456789","111111111111111111");
插入失败,dentity字段的内容在表中已经存在,不能重复
insert into students values (2,"王二","123456789","");
插入成功
insert into students values (3,"王二","1111","1111");
插入成功

 select * from students;
+----+--------+-----------+--------------------+
| id | name   | phone     | dentity            |
+----+--------+-----------+--------------------+
|  1 | 王二   | 12345678  | 111111111111111111 |
|  2 | 王二   | 123456789 |                    |
|  3 | 王二   | 1111      | 1111               |
+----+--------+-----------+--------------------+
3 rows in set (0.00 sec)

小知识:如果表已经创建成功,但是想要修改表中的字符集
alter table students convert to character set utf8

6、外键

外键就需要涉及多张表了。
比如:

表一,班级表
create table classes(
	id int primary key comment "班级号",
	name varchar(11 not null comment "班级名称"
);

表二,学生表
create table students(
	id int primary key comment "学号",
	name varchar(11 not null comment "名字",
	class_id int comment "所处班级"
);

这两张表中,其中班级表 name字段就是外键。
学生表关联班级表,班级表是被关联者,班级表属于主表,学生表属于从表。

但是上面两张表并没有构成外键约束。
看例子:

mysql> select * from students;
+-----+--------+--------+
| id  | name   | class_id |
+-----+--------+--------+
|   2 | 小彭   |    101 |
|   3 | 小波   |    102 |
|   4 | 小烧   |    400 |
|   1 | 小陈   |    100 |
+-----+--------+--------+
我是能插入班级等于400的数据的,可实际上班级表中并没有400这个班级,这就是并没有设置外键约束

mysql> select * from classes;
+-----+-----------+
| id  | name      |
+-----+-----------+
| 100 | 尖子班    |
| 101 | 普通班    |
| 103 | 文艺班    |
+-----+-----------+
正确做法,在创建班级表的时候加外键约束
表一,班级表
create table classes(
	id int primary key comment "班级号",
	name varchar(11 not null comment "班级名称",
	foreign key (class_id) references myclass(id)
);

语法:foreign key (字段名) references 主表(列)

可能有人会说,我们不是可以用一张表吗?在学生表后面再加一个班级字段就行了啊,为什么还要多弄处一张表出来?

一张表会造成数据冗余

首先我们承认,这个世界是数据很多都是相关性的。
理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。
因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。
解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MySQL-约束篇】 的相关文章

  • 这个 SQL DELETE FROM 语法有什么问题?

    我正在尝试删除 96k 记录 删除表 xoops bb posts text 页面中没有与 xoops bb posts 匹配的 post id 的所有记录 此查询返回 91k 条记录 SELECT FROM xoops bb posts
  • HTAccess - 令人困惑的干净网址

    如果我想简单地重定向 clients page to clients php view page我会使用像这样简单的东西 它效果很好 Options FollowSymlinks RewriteEngine on RewriteRule c
  • Hibernate 可以使用 MySQL 的“ON DUPLICATE KEY UPDATE”语法吗?

    MySQL 支持 INSERT ON DUPLICATE KEY UPDATE 语法允许您 盲目 插入数据库 并回退到更新现有记录 如果存在 当您想要快速事务隔离并且想要更新的值取决于数据库中已有的值时 这非常有用 作为一个人为的示例 假设
  • MySQL有两个不同的密码?

    我确信它们是不同事物的密码 但我不确定是什么 当在终端连接到 MySQL 时 我输入 usr LOCAL mysql BIN mysql h host u username p然后系统会提示我输入密码 密码是 但是当使用 PHP 连接到 M
  • MySQL Workbench 6.0 错误无法获取管理员的管理访问权限?

    我在这里使用 MySQL Workbench 6 0 当我选择服务器状态时 出现此错误 对此 我尝试在Google和StackOverflow上寻找解决方案 e g 这个结果 https stackoverflow com question
  • SQL 检查一组日期是否在指定的日期范围内

    我有一个表 其中保存架构中房间不可用的日期 ROOM ID DATE UNAVAILABLE 我需要一个 sql 查询来检查两个日期范围内是否有可用房间 类似于 Select All rooms that are constantly av
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)

    文章目录 观察者模式 运用 实现 观察者模式 定义 他用来定义对象之间一种一对多的依赖关系 当一个对象状态发生改变时 所有依赖他的对象都会得到通知 运用 如果我们使用过 DOM 上的事件函数 那就接触过观察者模式 document body
  • (亲测好用)idea提示内存不足( ran out of available memory)

    idea提示内存不足 ran out of available memory 错误提示 The IDE ran out of available memory Please consider increasing the value of
  • 【LeetCode】3. 无重复字符的最长子串 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

    3 无重复字符的最长子串 给定一个字符串s 请你找出其中不含有重复字符的最长子串的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解
  • webpack打包优化和打包上线

    通过 npm run serve 启动本地 执行 development 通过 npm run test 打包测试 执行 testing 通过 npm run build 打包正式 执行 production 图片优化 使用 url loa
  • Uniapp低功耗蓝牙操作实例

    uniapp低功耗蓝牙在移动端使用较为平常 本文相较于官方文档介绍一下低功耗蓝牙的操作案例 即取即用 低功耗蓝牙虽工作原理与经典蓝牙类似 但是有着独特的架构体系 所以LE独立出来成为一种蓝牙形态 不过LE和经典蓝牙使用相同的2 4G无线电频
  • 机器学习好伙伴之scikit-learn的使用——datasets获得数据集

    机器学习好伙伴之scikit learn的使用 datasets获得数据集 载入sklearn中自带的datesets 利用sklearn的函数生成数据 应用示例 利用sklearn中自带的datesets进行训练 利用sklearn中生成
  • 使用ASMD 来描述硬件电路并辅助verilog 代码的编写

    TOC 使用ASMD 来描述硬件电路并辅助verilog 代码的编写 ASMD 的定义 ASM 算法状态机 图是描述时序状态机的一种抽象 类似于软件流程图 描述状态机的动作 但是ASM 图只显示控制信号和行为动作 控制状态 不显示存储元件所
  • 详谈redis之有序集合(ZSET)

    一 前言 有序集合存储着成员 member 和分值 score 的键值对 按照分值从小到大自动排序 具体细节在第一篇blog 详谈redis数据结构 中 不太熟悉的同学可以回去查看 对Java不太熟悉的同学可关注文章末尾的公众号 里面满满干
  • uniapp小程序的苹果 ios页面左右或上下滑动问题的解决方法效果damo(整理)

    一般来说 微信小程序的页面是不需要左右滑动的 甚至说是不允许左右滑动的 事实上 安卓手机在默认情况下就是左右不滑动的 但苹果IOS手机默认是左右可滑动的 其解决方法如下 在具体页面的顶级view元素设置class page 其CSS样式如下
  • eclipse中建动态web项目

    1 eclipse环境下配置tomcat 2 建项目 这就是一个建好的项目 3 将项目部署在tomcat服务器中 这个时候你的项目就部署在服务器上了
  • k8s 控制器:Replicaset 和 Deployment

    Deployment 官方文档 https kubernetes io docs concepts workloads controllers deployment k8s 在定义 pod 资源时 可以直接创建一个 kind Pod 类型的
  • 漫画告诉你:区块链到底是什么?

    区块链到底是什么 一幅漫画让你秒懂 区块链技术是指一种全民参与记账的方式 所有的系统背后都有一个数据库 你可以把数据库看成是就是一个大账本 目前是各自记各自的账 由于没有中心化的中介机构存在 让所有的东西都通过预先设定的程序自动运行 不仅能
  • JAVA垃圾分类网站计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 本源码技术栈 项目架构 B S架构 开发语言 Java语言 开发软件 idea eclips
  • 第一篇 香橙派刷机和开发环境准备(ubuntu20.04版)

    目录 一 香橙派刷ubuntu系统和SSH登录 1 Ubuntu有趣的Codename 2 刷机步骤 ubuntu20 04 格式化TF卡 烧写系统到TF卡 调试串口登陆系统 SSH登陆系统 二 开发环境准备 1 香橙派ubuntu20 0
  • “宝藏”,实用网站整理 - 持续更新ing

    文章目录 一 编程类 1 在线编程工具 1 ideone com 2 Octave Online 3 Anycodes 在线编程 2 编程刷题网站 1 LeetCode 2 牛客网 二 在线工具类 1 菜鸟工具 2 在线工具 程序员的工具箱
  • P2P原理以及如何实现(整理)

    前言 这几天看了p2p的原理以及实现的demo 整理一下 一共分为三部分 第一是概念原理 第二是demo实现 第三是p2p协议相关以及分类 一 概念原理 比较全面的理解 https zhuanlan zhihu com p 30351943
  • 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法

    原文 WGS 84 到 GCJ 02 的转换 即 GPS 加偏 算法是一个普通青年轻易无法接触到的 公开 的秘密 这个算法的代码在互联网上是公开的 详情请使用 Google 搜索 wgtochina lb 整理后的算法代码请参考 https
  • 什么是外包公司?要不要去外包公司?

    01 什么是软件外包 软件外包分为 人力外包和项目外包两个方向 1 1 劳务派遣 指的是把员工外派到对应的用工企业打 短工 比如很多工程师虽然签约了中软国际 东软 文思海辉 软通动力 润和等软件公司 但实际工作地点是在华为 接受华为员相关负
  • c语言还有用吗?

    c语言还有用吗 这个问题有很多人在问 c语言真的没用吗 答案是有用的 用处还很大呢 这门语言虽然是很早以前发明的 新兴语言如c vb 功能十分强大 但每一个能代替C语言 原因 C
  • 【MySQL-约束篇】

    目录 1 空值 Null 2 默认值 3 主键 4 自增 5 唯一键 6 外键 1 空值 Null 先看一个表结构 Field Type Null Key Default Extra id int 11 YES NULL name