mysql常见六大约束

2023-11-16

DDL语言

常见约束:

**约束的含义**:
一种限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性
**分类:** 六大约束
		1. NOT NULL :非空约束,用于保证该字段的值不能为空
		比如姓名,学号等
		2. DEFAULT :默认约束,用于保证该字段有默认值
		比如性别
		3. PRIMARY KEY :主键约束,用于保证该字段的值具有唯一性,并且非空
		比如学号,员工编号等
		4. UNIQUE : 唯一约束,用于保证该字段的值具有唯一性,可以为空
		比如座位号
		5.CHECK:检查约束【mysql中不支持,sql语法支持,语法不报错,但是没效果】
		比如年龄、性别,可以设置一个范围
		6.FOREIGN	KEY :外键约束,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
		在从表中添加外键约束,用于引用主表中某列的值
		比如学生表的专业编号,员工表的部门编号,员工表的工种编号

添加约束的时机:
1.创建表时
2.修改表时

约束的添加分类:
1.列级约束:
六大约束 语法上都支持,但外键约束没有效果

2.表级约束:
除了非空、默认。其他的都支持

3.表级约束和列级约束的区别对比
在这里插入图片描述

一、创建表时添加约束

1.添加列级约束

语法:
直接在字段名和类型后面追加 约束类型即可。
只支持:主键、非空、默认、唯一 四种约束

案例:

#创建数据库
CREATE DATABASE students;
#进入数据库
USE students;

#创建表
#创建专业信息表				
CREATE TABLE major(
		ID INT PRIMARY KEY,
		majorName	 VARCHAR(20)
		);
#创建学生表
CREATE TABLE stuinfo(
				id INT PRIMARY KEY,#主键
				stuName		VARCHAR(20)	NOT NULL, #非空
				sex 	CHAR(1) CHECK(sex=OR sex=),#检查约束,对mysql没效果,了解写法
				seat INT UNIQUE,#唯一约束
				age INT DEFAULT 	18,#默认约束
				marjorID INT REFERENCES major(id) #添加外键 FOREIGN KEY	外键约束在列级约束中不支持
				);

#查看表信息
desc stuinfo
#查看statuinfo表中所有的索引,包括主键,外键,唯一
show INDEX from stuinfo

2.添加表级约束

	语法:
			在各个字段的最下面,添加:
			【CONSTRAINT 自定义约束名字】 约束类型 (字段名)
	注意:
			1.CONSTRAINT 改名,对主键无效,默认为 PRIMARY
			2.也可以不写	【CONSTRAINT 自定义约束名字】 ,则约束名字默认为字段名

案例:

#创建表
#创建专业信息表				
CREATE TABLE major2(
		ID INT PRIMARY KEY,
		majorName	 VARCHAR(20)
		);
#创建学生表
CREATE TABLE stuinfo2(
				id INT ,
				stuName		VARCHAR(20),
				sex 	CHAR(1),
				seat INT ,
				age INT ,
				marjorID INT,
				CONSTRAINT pk  PRIMARY KEY(id),#添加表级约束,主键,mysql中主键改名不生效,名字永为默认名 PRIMARY
				CONSTRAINT uq  UNIQUE(seat),#唯一键
				CONSTRAINT ck  CHECK(sex='男' OR sex='女'), #检查约束,mysql不支持
				CONSTRAINT fk_stuinfo_major2 FOREIGN KEY(marjorID) REFERENCES major2(ID) #外键
				);

#查看表信息
desc stuinfo2
#查看statuinfo表中所有的索引,包括主键,外键,唯一
show INDEX from stuinfo2

总结:何时用列级约束,何时用表级约束

通用的写法:
CREATE TABLE IF NOT EXISTS stuinfo(
				id INT PRIMARY KEY,
				stuname  VARCHAR(20) NOT NULL,
				sex CHAR(1),
				age INT DEFAULT 18,
				seat INT UNIQUE,
				majorid INT,
				constraint fk FOREIGN KEY(majorid) REFERENCES major(ID)
);
面试常见问题:

①主键约束和唯一约束的大对比:
在这里插入图片描述
②外键的特点:

1.要求在从表设置外键关系
2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3.主表的关联列必须是一个key(一般是主键或唯一)
4.插入数据时,先插入主表的数据,再插入从表
	删除数据时,先删除从表,再删除主表

两种删除方式了解即可
在这里插入图片描述

二、修改表时 添加约束

1.添加列级约束

ALTER TABLE	表名 MODIFY COLUMN 字段名 字段类型	新约束;

2.添加表级约束

ALTER	TABLE 表名	addCONSTRAINT 约束名】 约束类型(字段名)	【外键的引用】

创建测试环境

drop TABLE if exists	stuinfo10;
CREATE TABLE stuinfo10(
				id INT ,
				stuName		VARCHAR(20),
				sex 	CHAR(1),
				seat INT ,
				age INT ,
				marjorID INT
				)

2.1.添加非空约束

ALTER TABLE stuinfo10 MODIFY COLUMN stuname VARCHAR(20) NOT NULL;

2.2.添加默认约束

ALTER	TABLE stuinfo10 MODIFY COLUMN age INT DEFAULT 18;

2.3.添加主键

①列级约束
ALTER TABLE stuinfo10 MODIFY COLUMN id INT PRIMARY KEY;
②表级约束	
ALTER TABLE stuinfo10	ADD	PRIMARY KEY(id);

2.4.添加唯一

	①列级约束
	ALTER TABLE stuinfo10 MODIFY COLUMN seat INT UNIQUE;
	②表级约束
	ALTER TABLE stuinfo10 ADD UNIQUE(seat);

2.5.添加外键,【CONSTRAINT 自定义名称可以省略】

ALTER TABLE stuinfo10 ADDCONSTRAINT fk_stauinfo_major】 FOREIGN KEY(majorid) REFERENCES major(id);

三、修改表时删除约束

1.删除非空约束

ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型  NULL;
#举例
ALTER TABLE stuinfo10 MODIFY COLUMN stuname VARCHAR(20)  NULL;

2.删除默认约束

ALTER TABLE stuinfo10 MODIFY COLUMN age INT;

3.删除主键

	ALTER TABLE 表名 DROP PRIMARY KEY;

4.删除唯一

ALTER TABLE stuinfo10 DROP UNIQUE(seat);

5.删除外键约束

ALTER TABLE stuinfo10 DROP FOREIGN KEY 外键的名称
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系: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
  • 在 MySQL 数据库中存储图像文件或 URL?哪个更好? [复制]

    这个问题在这里已经有答案了 可能的重复 在数据库中存储图像 是还是否 https stackoverflow com questions 3748 storing images in db yea or nay 数据库中的图像与文件系统中的
  • MySQL 与 PHP 的连接无法正常工作

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

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

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • 比较表中的行以了解字段之间的差异

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

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save

随机推荐

  • elementui 计数器

    输入值超过规定的最大值 比如999 输入1000时 输入后 直接提交表单 中间计数器会自动把1000转化为999 再提交 测试人员说没有出现 不能超过3位数字的提示 解决办法 把min和max去掉 再写自定义验证规则就可以了 计数器自动转化
  • JavaScript:iterable类型

    遍历Array可以采用下标循环 遍历Map和Set就无法使用下标 为了统一集合类型 ES6标准引入了新的iterable类型 Array Map和Set都属于iterable类型 具有iterable类型的集合可以通过新的for of循环来
  • 向量积(叉积)及其计算

    定义 两个向量a和b的 向量积 外积 叉积 是一个向量 记作a b 这里 并不是乘号 只是一种表示方法 与 不同 也可记做 若a b不共线 则a b的模是 a b a b sin a b a b的方向是 垂直于a和b 且a b和a b按这个
  • 【Linux】基于单例模式懒汉实现方式的线程池

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 LockGuard hpp 二 Task hpp 三
  • 二叉查找树(BST)的基本概念及常用操作

    二叉查找树 二叉查找树 Binary Search Tree 也称二叉搜索树 有序二叉树 ordered binary tree 排序二叉树 orted binary tree 是指一棵空树或者具有下列性质的二叉树 若任意节点的左子树不空
  • 有效的括号 力扣 栈应用

    上班摸鱼打代码 o 目录 题目描述 AC代码 思路分析 题目描述 给定一个只包括 的字符串 s 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 示例 1 输入 s 输出 true示例 2
  • HECI-Securtiy 防火墙路由技术

    目录 一 防火墙路由基本原理 1 路由分类 2 路由优先级 3 路由查询先后顺序 4 静态路由基本原理 1 指定出接口场景 2 指定下一跳地址场景 5 静态路由与多出口 1 主备备份 2 均衡式负载分担 3 溢出式负载分担 二 逐流与逐包报
  • 2022年实习面试 凉经

    2022年实习面试 凉经 字节跳动 数据分析师 2022 8 3 首先是自我介绍 其次给我出了一道sql的题目 里面用到了group by 的分组函数 以及最好嵌套一个子查询 然后出了一道题 感觉是产品经理方向 说B战有一个视频的播放量 一
  • java awt实现拖拉式文件路径获取

    package com example drag import java awt GridLayout import java awt datatransfer DataFlavor import java awt dnd DnDConst
  • SQL——根据字段包含值,统计条数(全文索引、CONTAINS、instr)

    根据字段包含值 统计条数 例如my column字段值可能为 0 1 2 3 4 5 目标 统计my column中的值为0 为1 为2 的各个条数 方式一 使用CONTAINS 该功能建立在全文索引之上 删除全文索引 DROP CONTE
  • 景联文科技高质量教育GPT题库:引领教育行业的技术革命

    ChatGPT拉开了大语言题库和生成式AI产业蓬勃发展的序幕 全世界教育科技公司扎堆接入GPT 4 涵盖美国 欧洲 日韩 中东和北非地区等 大语言题库在教育领域中势必将获得更加广阔的应用前景和丰富的应用场景 杭州景联文科技是AI基础数据行业
  • ElasticSearch text 和 keyword 类型

    ElasticSearch text 和 keyword 类型 text 会进行分词 先把对象进行分词处理 然后存入到es中 当使用多个单词进行查询的时候 查不到已经分词过的内容 keyword 不会进行分词 不会对es中的对象进行分词处理
  • FreeRTOS任务创建、删除

    目录 一 FreeRTOS任务创建与删除有关函数 1 1 创建 删除任务的API函数 1 1 1 动态创建任务 1 1 2 静态创建任务 1 1 3 删除任务 二 FreeRTOS任务创建与删除 动态方法 2 1 实例 三 FreeRTOS
  • LeetCode 沙漏的最大总和

    以最中间的的那个元素来移动 整个沙漏移动 class Solution public int maxSum int grid int max 0 int sum 0 for int i 1 i lt grid length 1 i for
  • 【华为OD机试】路灯照明问题【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 在一条笔直的公路上安装了N个路灯 从位置0开始安装 路灯之间间距固定为100米 每个路灯都有自己的照明半径 请计算第一个路灯和最后一个路灯之间 无法照明的区间的长度和
  • 线上git仓库地址更改,本地如何更改?

    1 进入终端查看本地代码关联的git仓库地址 git remote v 2 删除本地关联的git仓库地址 git remote rm origin 3 本地代码关联新的仓库地址 git remote add origin 新地址 4 再次查
  • 获取BDUSS的简单方式

    BDUSS是登录百度 web wap 后的唯一身份凭证 baidu com 受http only保护 拿到BDUSS就等于拿到帐号的控制权 通行贴吧 知道 百科 文库 空间 百度云等百度主要产品 在 贴吧云签系统 中 需要用到BDUSS进行
  • Linux下查看磁盘使用率及文件和文件夹大小

    原文地址 http blog sina com cn s blog 4ab088470106ge0o html 大家在使用linux的过程中 或许遇到过数据无法入库 无法上传数据等等 这就要多长个心眼 去查看一下磁盘使用率和文件大小吧 这时
  • 贪心+二分解决最大值最小、最小值最大问题

    在刷题时 总会遇到求最大值最小 最小值最大问题 也许它会暗喻是这样的一个问题 对于这样的一个问题 你会发现用dp和枚举都会超时超内存 或者说很麻烦 所以这是一个比较简单的解题方式 二分逼近思想 对于难以直接确定解的问题 采取二分枚举 检验的
  • mysql常见六大约束

    DDL语言 常见约束 约束的含义 一种限制 用于限制表中的数据 为了保证表中的数据的准确性和可靠性 分类 六大约束 1 NOT NULL 非空约束 用于保证该字段的值不能为空 比如姓名 学号等 2 DEFAULT 默认约束 用于保证该字段有