【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-约束篇】 的相关文章

  • mysql:谁阿米?

    有没有whoami类似mysql中的函数 我正在从远程主机连接到 mysql 命令行 我不确定我的 IP 地址是否解析为域名 我想看到类似的东西 mysql gt whoami User Host username resolved hos
  • PhpMyAdmin 导出不包括 mysqldump 中的主键

    用PhpMyAdmin导出同一个表的结构 DROP TABLE IF EXISTS test apprentis CREATE TABLE IF NOT EXISTS test apprentis a id smallint 10 NOT
  • Laravel 4 - JOIN - 相同的列名

    我目前使用此代码从数据库中检索所需的数据 query DB table packages gt join assigned packages function join use id join gt on packages id assig
  • 将歌词存储在 MySQL 数据库中

    我想知道在 mysql 数据库中存储音乐 歌词 的最佳方式是什么 以及用于此目的的设置是什么 另外 我想要表格来存储断线 我正在考虑使用 指示新行并使用 php 替换字符串 我不知道从哪里开始 或者使用什么参数 varchar int 我知
  • sql连接一个表中的两个字段

    我有一个预订表 其中有两个人 我想将 person 1 作为一行返回 将 person 2 作为新行返回 但该人的 id 与人员表相关 这是我所得到的 但没有提取预订信息 SELECT people FROM select booking
  • 选择列表包含非聚合列

    自从更新 MySQL 以来 我注意到以下查询失败 SELECT u p name as plan COUNT u id as totalprojects FROM users u LEFT JOIN plans p ON p id acce
  • 自动递增和最后插入 ID

    我在用着AUTO INCREMENT我想获取插入行的 ID 以便我可以使用更新另一个表ID作为两个表之间的公共字段 我明白LAST INSERT ID会排在最后ID 然而 我担心的是 数据库被许多用户同时访问 因此 可能有另一个进程访问该表
  • 如何在mysql中设置“performance_schema on”?

    我想转performance schemaON 在 mysql 中收集统计信息 我怎样才能实现这个目标 以下指南是特定于 Linux 的 但应该很容易适用于 Windows 您必须检查 mysql 服务器二进制文件是否已编译为支持它 mys
  • 使用 MySQL 触发器将所有表更改记录到辅助表

    我有一张桌子 CREATE TABLE data table data id INT NOT NULL AUTO INCREMENT PRIMARY KEY field1 INT NOT NULL field2 INT NOT NULL f
  • Hibernate HQL Join 查询 DOT 节点,没有左侧

    我有两个模型类 应用程序 java Entity Table name Application catalog mysqldb XmlRootElement public class Application extends BaseObje
  • 动态表单字段验证的数据库设计

    在我的应用程序中 我允许用户创建一个包含他们想要的任何 HTML 表单字段 例如文本输入 文本区域 选择等 的表单 我想让用户能够为每个字段定义 0 个或多个累积验证规则 最多可能有 25 个不同的验证规则 我应该如何建模 这是一个潜在的解
  • UTF-8、PHP 和 XML Mysql

    我在解决这个问题时遇到了很大的问题 我有一个编码 latin1 swedish ci 的 mysql 数据库和一个存储名称和地址的表 我正在尝试输出 UTF 8 XML 文件 但在使用以下字符串时遇到问题 Otiv gen它被输出为Otiv
  • MySQL 启动错误 - 根元素丢失

    我在 Windows Server 2003 R2 上安装 MySQL 大约两个月了 启动时 我们会看到一个错误 显示 高严重性错误 根元素丢失 然后是另一个高严重性错误 显示 在调用 WriteToLog 方法之前必须定义日志文件路径 任
  • 如何将UTF-8编码的汉字从MySql正确导出到SQL

    过去三天我们正在与严重的问题作斗争 我们从PhpmyAdmin导出MySql数据库文件 数据库条目中写入的数据是带有UTF 8字符集的中文 导出后将其转换为拉丁字符集 现在我们正在将此数据库SQl文件导入到其他主机 我们在UTF 8和排序规
  • 如何使用Python的Mysqldb模块?而不是 %s 作为查询参数?

    MySqlDb 是一个很棒的 Python 模块 但有一个部分非常烦人 查询参数如下所示 cursor execute select from Books where isbn s isbn 而已知宇宙中的其他地方 oracle sqlse
  • mysql错误1442的真正原因是什么?

    好吧 我在互联网上寻找了很多地方来寻找原因mysql error 1442其中说 无法更新存储函数 触发器中的表 unlucky table 因为 它已被调用此存储的语句使用 功能 触发器 有人说这是 mysql 中的一个错误或者它不提供的
  • 删除 ibdata1 后 MySQL 表消失了

    几天前 经过一番谷歌搜索后 我发现了这篇文章 我无法再让 mysql 运行了 xampp XAMPP MySQL 意外关闭 https stackoverflow com questions 18022809 xampp mysql shu
  • SQL 未插入到 Yii 中具有关系的表中

    我正在尝试创建一个用户 但所有值都没有插入到数据库中 Systems user 表与partys 表有关系 因为party id 是sytems user 的主键 没有插入任何内容 甚至没有错误 它只是返回到 创建 页面 这是我的架构 Ta
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • mysql 准备好的语句错误:MySQLSyntaxErrorException

    我使用准备好的语句编写了选择语句 每次尝试运行都会出现此错误 我如何克服这个错误 我的jdbc连接器是mysql connector java 5 1 13 bin jar 我的代码 public Main add ad to getAdD

随机推荐

  • 观察者模式 & 发布-订阅模式(设计模式与开发实践 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