MySQL-约束(三)

2023-05-16

MySQL-约束

  • 约束的定义
  • 常见的约束类型
  • 表级约束与列级约束
    • 例子
    • 非空约束(NOT NULL)
    • 唯一约束(UNIQUE)
      • 联合唯一约束
    • 默认约束(DEFAULT)
    • 主键约束(PRIMARY KEY)
      • 复合主键约束
      • 复合主键与联合主键
    • 外键约束(FOREIGN KEY)

约束的定义

约束是一种限制,它通过对表的行和列的限制,实现准确性、完整性、一致性

常见的约束类型

MySQL中我们常用到的约束有

约束类型非空约束唯一约束默认约束主键约束外键约束
关键字not nulluniquedefaultprimary keyforeign key

表级约束与列级约束

  • 表级约束:对多个字段创建约束,在列定义后添加
  • 列级约束:对一个字段创建的约束,可以在列定义时添加也可以通过修改列结构时添加
  • 主键、外键、唯一可作为表级约束也可以作为列级约束
  • 非空、默认只能作为列级约束

例子

下面是例子的表结构,comment为注释,以下的操作均使用本例子

create table me(
id int,
name varchar(20) comment '姓名',
phone varchar(20) comment '手机号',
site varchar(20) comment '地址',
);

非空约束(NOT NULL)

非空约束指定某一字段不能为空,使用非空约束后添加数据时字段不可为空

在创建表时添加非空约束

使用方法直接在字段后面添加非空约束

name varchar(20) not null,

修改表结构时添加非空约束

使用格式:alter table <表名> modify <字段名> <数据类型> not null ;

alter table me modify name varchar(20) not null;

删除非空约束

删除非空约束时和添加一样,修改表结构不加not null就可以

alter table me modify name varchar(20);

唯一约束(UNIQUE)

唯一约束使表中的某一列的数据为唯一,重复即报错,可为空

在创建表时添加唯一约束

使用方法直接在字段后面添加唯一约束

name varchar(20) unique,

修改表结构时添加唯一约束

使用格式:alter table <表名> modify <字段名> <数据类型> unique ;
以下为三种方法,第三种方式中的uk_name为唯一约束名

alter table me modify name varchar(20) unique;
alter teble me add unique(name);
alter table me add constraint uk_name unique(name);

删除唯一约束

alter table me drop index name;
alter table me drop key uk_name;

联合唯一约束

使多个字段(列)联合一起的唯一约束,联合唯一约束就要使用到了表级约束
以下添加name,phone的联合唯一约束,表示name和phone联合是唯一的,单个不唯一
添加一条数据时name与phone与数据中的name与phone都相同时出现报错,只有name或者phone相同不会报错

alter table me add constraint uk_phone unique(name,phone);    #添加联合唯一约束
alter table me drop key uk_phone;                             #删除联合唯一约束

默认约束(DEFAULT)

默认约束为列(字段)添加默认值,添加数据为空时使用默认值

在创建表时添加默认约束

使用方法直接在字段后面添加默认约束

name varchar(20) default '周八',

修改表结构时添加默认约束

使用格式:alter table <表名> modify <字段名> <数据类型> default ‘默认值’;
注意第二种方法中字段名(列名)编写两次

alter table me modify name varchar(20) default '周八';
alter table me change column name name varchar(20) default '周八';

删除默认约束

删除默认约束时和添加一样,修改表结构不加default就可以

alter table me modify name varchar(20);
alter table me change column name name varchar(20) default null;

主键约束(PRIMARY KEY)

主键约束使其值能唯一地标识表中的每一行,主键约束的列里的数据不能相同,不能为空,一般配合自增使用
每个表中只能有一个主键,多个字段(列)的复合主键为一个主键

在创建表时添加主键约束

使用方法直接在字段后面添加主键约束

name varchar(20) primary key,

修改表结构时添加主键约束

使用格式:alter table <表名> modify <字段名> <数据类型> primary key ;
以下为三种方法,第三种方式中的pk_name为主键约束名

alter table me modify name varchar(20) primary key;
alter teble me add primary key(name);
alter table me add constraint pk_name primary key(name);

删除主键约束

alter table me drop primary key;

复合主键约束

复合主键约束指一个表中一个以上的字段(列)组成的主键,复合主键约束就要使用到了表级约束
以下添加name,phone的复合主键约束,表示name和phone组合起来的一个主键
通俗易懂的了解就是一个表中班级和姓名是一个复合主键,有个姓名出现在两个班级里,由于一个班级的人比较多而产生相同的主键班级,但相同姓名不是一个班级这就是复合主键,如果同一个班级出现两个相同的名字就违背的主键的唯一性原则

primary key(name,phone)                                         #创建表时添加复合主键约束,在列定义后添加  
alter table me add constraint pk_phone primary key(name,phone);   #修改表时添加复合主键约束
alter table me drop primary key;                                    #删除复合主键约束
alter table me drop primary key,add primary key(name);          #删除复合主键中的单个方法为删除接添加,语句简练。

复合主键与联合主键

此为其余知识点
参考文章复合主键与联合主键,本人的理解复合主键就是单表多字段,联合主键就是多表多字段,但个人觉得联合主键的多表并没有太大的意义和用途

外键约束(FOREIGN KEY)

外键约束用来在两个表的数据之间建立链接,外键约束可以有一列或者多列,一个表可以有一个或多个外键
外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值
外键对应的是另一个表的主键,定义外键后不可以删除另一个表中关联的行
两个关联的表中,存在主键的表为主表,存在外键的表为从表

在上面的例子上在添加一个mee表使用表级约束添加外键me_id,最后一行的fk_mee_me为外键约束名,同时将me表的id字段添加主键约束

create table mee(
id int primary key,
me_id int,
score varchar(20) comment '成绩',
number varchar(20) comment '学号',
constraint fk_mee_me foreign key(me_id) references me(id)
);

在修改表时添加外键约束

alter table mee add constraint fk_mee_me foreign key(me_id) references me(id);

删除主键约束

alter table mee drop foreign key fk_mee_me;

以上均为本人笔记,如有错误请指正,谢谢。

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

MySQL-约束(三) 的相关文章

  • Galera 集群问题

    我想在我们的生产环境中使用Galera集群 但我有一些顾虑 每个表必须至少定义一个显式主键 每个表必须运行在InnoDB或XtraDB存储引擎下 分批处理您的大额交易 例如 不要让一个事务插入 100 000 行 而是将其分成更小的块 例如
  • 如果没有找到值,如何让 MySQL 中的 SUM 函数返回“0”?

    假设我在 MySQL 中有一个简单的函数 SELECT SUM Column 1 FROM Table WHERE Column 2 Test 如果没有条目Column 2 包含文本 Test 然后该函数返回NULL 而我希望它返回 0 我
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • covertJSONtoSQL 在 NiFi 中返回空值

    我正在设计一项工作 使用以下命令将数据从 MySQL 中的数据库转移到另一个数据库 MySQL 执行SQL处理器随后将Avro转换为Json then 将Json转换为SQL then PutSQL如下流程图所示 将JSON转换为SQL返回
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • Google Cloud SQL 在重新启动时卡住

    我的云 sql 实例长时间处于重新启动状态 在操作窗格中 重新启动的状态显示为待处理 并且还发生了导出 其状态仍为Running 有没有办法可以强制重新启动或取消重新启动或从常规备份中恢复数据 不 没有办法 如果您向 Google 支付高级
  • 即使没有结果也返回一个值

    我有这种简单的查询 它返回给定 id 的非空整数字段 SELECT field1 FROM table WHERE id 123 LIMIT 1 问题是如果找不到 id 结果集就是空的 我需要查询始终返回一个值 即使没有结果 我有这个东西工
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • 每月获取记录,但如果该月没有记录,则为零

    如果我有以下 SQL 表 Tests id type receiveDate 1 Blood 2012 01 18 2 Blood 2012 01 20 3 Blood 2012 01 18 4 Blood 2012 03 01 5 Blo
  • PHP 和 MySQL - 高效处理多个一对多关系

    我正在寻求一些有关使用 MySQL 和 PHP 检索和显示数据的最佳方法的建议 我有 3 个表 所有一对多关系如下 Each SCHEDULE有很多覆盖每个覆盖都有很多地点 我想检索这些数据 以便它可以全部显示在单个 PHP 页面上 例如列
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主

随机推荐

  • 2021-02-19

    This node presents a fast and precise method to estimate the planar motion of a lidar from consecutive range scans It is
  • 牛客网错题整理--C++篇4

    能够在字符串 aabaaabaaaab 中匹配 aab xff0c 而不能匹配 aaab 和 aaaab 34 的正则表达式包括 A a b B a 2 b C aa b D aaa b 正确答案 C 我的答案 B C 错误原因 xff1a
  • 动手学无人驾驶(6):基于IMU和GPS数据融合的自车定位

    在上一篇博文 动手学无人驾驶 xff08 5 xff09 xff1a 多传感器数据融合 介绍了如何使用Radar和LiDAR数据对自行车进行追踪 xff0c 这是对汽车外界运动物体进行定位 对于自动驾驶的汽车来说 xff0c 有时也需要对自
  • ubuntu内核版本5.4.0-92-generic 编译 4.15版本内核遇到报错 :PIC mode相关错误 【已解决】

    背景 xff1a 需要换个低版本内核来编译东西 因为高版本kernel拿来编译相对老的内核的时候 xff0c 有一些报错 xff0c 比如这个 PIC mode 的错误 xff0c 也许是新版本支持 老版本不支持的特性 xff0c 此处就暂
  • 进程切换与中断

    进程切换指从正在运行的进程中收回处理器 xff0c 让待运行进程来占有处理器运行 实质上就是被中断运行进程与待运行进程的上下文切换 进程切换必须在操作系统内核模式下完成 xff0c 这就需要模式切换 模式切换又称处理器切换 xff0c 即用
  • Rviz玩转三轴机械臂

    前言 最近想加深ROS仿真机械臂的理解 xff0c 所以笔者参考一些资料与博客 xff0c 在ROS下搭个简单的三轴机械臂 xff0c 在Rviz下实现各轴关节转动 xff0c 如果后续有时间的话 xff0c 可能会更新下Gazebo下仿真
  • benchmark和baseline的解释以及区别

    Benchmark和baseline都有性能比较的意思 先看看字典定义 benchmark xff1a N COUNT A benchmark is something whose quality or quantity is known
  • 树莓派控制无人机实现定点降落(一)——树莓派4安装ROS(Kinetic)

    目录 树莓派控制无人机实现定点降落 xff08 一 xff09 树莓派4安装ROS xff08 Kinetic xff09 1 安装ROS仓库2 安装Bootstrap依赖3 rosdep初始化4 安装ros5 解决依赖6 构建 xff08
  • 树莓派控制无人机实现定点降落(三)——PX4固件源码编译中的坑

    目录 树莓派控制无人机实现定点降落 xff08 三 xff09 PX4固件源码编译中的坑1 建立工作空间 xff0c 克隆固件源码2 arm none eabi gcc安装3 错误解决4 成功编译 树莓派控制无人机实现定点降落 xff08
  • 树莓派控制无人机实现定点降落(四)——gazebo无人机定点降落仿真环境搭建

    目录 树莓派控制无人机实现定点降落 xff08 四 xff09 gazebo无人机定点降落仿真环境搭建1 编译px4 sitl default2 编译gazebo3 仿真3 尝试offboard node4 无人机添加单目相机 树莓派控制无
  • 树莓派控制无人机实现定点降落(六)——地标识别及控制算法的实现

    目录 树莓派控制无人机实现定点降落 xff08 六 xff09 地标识别及控制算法的实现1 地标识别2 控制算法3 剩余工作 树莓派控制无人机实现定点降落 xff08 六 xff09 地标识别及控制算法的实现 地标识别方法同样参照了我上篇博
  • PIX飞控电流计设置

    在 测量电池电压 一栏输入用电压表测得的电池电压 xff0c 保存
  • Airsim_API

    AirSim API 参考自知乎大佬https www zhihu com column multiUAV 讲的非常好 xff01 无人机姿态角 pitch是俯仰角 xff0c 是 点头 yaw是偏航角 xff0c 是 摇头 roll是旋转
  • Apollo自动驾驶入门课程第①讲—无人驾驶概览

    目录 1 全面了解自动驾驶主要模块 2 了解无人车的运作方式 3 开放式软件栈 4 本节其他重点 本文转自微信公众号 xff1a Apollo开发者社区 原创 xff1a 阿波君 Apollo开发者社区 8月1日 在Apollo 3 0发布
  • mavsdk_api

    MAVSDK中offboard一些API Value 其中是offboard需要用到的一些参数定义 offboard PositionNedYaw class mavsdk offboard PositionNedYaw north m e
  • strstr()函数的使用说明(C语言)

    头文件 lt string h gt 函数作用 xff1a 1 strstr 函数搜索一个字符串在另一个字符串中的第一次出现 2 找到所搜索的字符串 xff0c 则该函数返回第一次匹配的字符串的地址 xff1b 3 如果未找到所搜索的字符串
  • Linux硬件信息查看命令

    查看磁盘 df 查看CPU信息 cat proc cpuinfo 查看显卡 lspci grep VGA 查看OS采用核心号 lsb release cs Linux查看当前操作系统版本信息 cat proc version Linux查看
  • DockerFile的使用

    DockerFile的使用 一 DockerFile构建过程解析1 1 Dockerfile内容基础知识1 2 Docker执行Dockerfile的大致流程 二 DockerFile常用保留字指令三 DockerFile案例3 1 先准备
  • myeclipse2019 4.0配置tomcat9的两个问题

    myeclipse2019 4 0配置tomcat9的两个问题 问题一 xff1a myeclipse配置tomcat端口无效 图中提示Tomcat的一个或多个端口无效 xff08 并非占用 xff0c 端口占用看问题二 xff09 出现这
  • MySQL-约束(三)

    MySQL 约束 约束的定义常见的约束类型表级约束与列级约束例子非空约束 NOT NULL 唯一约束 UNIQUE 联合唯一约束 默认约束 DEFAULT 主键约束 PRIMARY KEY 复合主键约束复合主键与联合主键 外键约束 FORE