Mysql之约束
创始人
2024-05-14 16:37:04
0

简介

在这里插入图片描述
not null前面也说过,这些约束是针对列的数据的,对应整个列的数据都起约束作用

基本但是创建表在字段后使用的语句

1.primary key-主键

在这里插入图片描述
在这里插入图片描述

==主键特征1.对应列不能有重复的数据2.不能为NULL ==
唯一且非空

-- 主键
-- id,name,email
CREATE TABLE t17(id INT PRIMARY KEY,-- 表示id列是主键`name` VARCHAR(32),email VARCHAR(32))
-- 主键列的值不能重复
INSERT INTO t17VALUES (1,'jack','jack@sohu.com');
INSERT INTO t17VALUES (2,'tom','tom.sohu.com')
INSERT INTO t17VALUES (1,'yuan','11.com')-- 如果执行完上面的,执行这行会报错因为id是主键,主键不能重而且不能为NULL!,之前有id=1的了,所以添加不成功

在这里插入图片描述

细节

1.一张表最多一个主键
加入就是想要两个关键字不能同时相同
有个复合主键

错误演示

CREATE TABLE t18(id INT PRIMARY KEY,-- 表示id列是主键`name` VARCHAR(32) PRIMARY KEY,email VARCHAR(32))报错,有两个主键

正确演示

CREATE TABLE t18(id INT ,`name` VARCHAR(32) ,email VARCHAR(32),PRIMARY KEY(id,`name`) -- 这里就是复合主键);
INSERT INTO t18VALUES (1,'jack','jack@sohu.com');
INSERT INTO t18VALUES (2,'tom','tom.sohu.com')
-- 上面正常操作
INSERT INTO t18VALUES (1,'cc','jack@sohu.com');
--上一行也可以添加进去因为复合主键是两个都相同才不能添加
SELECT * FROM t18
INSERT INTO t18VALUES (1,'jack','jack@sohu.com');
这个就报错了

查询
在这里插入图片描述
报错
在这里插入图片描述

2.主键可以在最后定义

CREATE TABLE t18(id INT ,`name` VARCHAR(32) ,email VARCHAR(32),PRIMARY KEY(`name`) -- 表定义最后指定主键);

3.使用desc查看表,可以看见主键情况
在这里插入图片描述

not null和unique

在这里插入图片描述

not null 前面的文章-Mysql数据库中的表
有讲

简而言之就是修饰的列类型不能为空
后面可以写成
NOT NULL DEFAULT 值
后面的值就是当为空时的默认值

UNIQUE
修饰的列数据
不能有相同的值
和主键不同的是
1.可以为NULL,且对应列的NULL不算重复,可以有多个NULL2.可以有多个unique字段3.可以把NOT NULL 和UNIQUE一起使用,达成类似主键的效果

forrign key-外键

在这里插入图片描述
这个约束就是
在我们有一个主表-定义好的
我们想定义一个从表,但是这个从表有一个元素要和这个主表的对应元素(主键、unique)相匹配才能添加
这时就可以用到外键了

在这里插入图片描述
比如这两个表
学生表的class_id必须和我们主表班级表
的id想匹配才可以添加
这个第三行数据就添加不成功,没有与其相匹配的班级的id
主表(外键对应元素)一个元素可以对应多个从表对应数据

细节

在这里插入图片描述
5.是对主表删除元素的限制

# 班级表-主表
# 学生表-从表
# 为了方便奥,我们把从表的定义外键类的数据列成为外键
# 而主表的对应外键的数据列叫主键
CREATE TABLE class(id INT PRIMARY KEY,`name` VARCHAR(32) NOT NULL DEFAULT '')
CREATE TABLE stu_02(id INT PRIMARY KEY,`name` VARCHAR(32) NOT NULL DEFAULT '',class_id INT,-- 下面定义外键关系FOREIGN KEY (class_id) REFERENCES class(id));-- class_id外键,id主键
INSERT INTO classVALUES (100,'java'),(200,'web');SELECT * FROM classINSERT INTO stu_02VALUES(1,'tom',100);
INSERT INTO stu_02VALUES(2,'jack',200);
-- 上面肯定能添加成功
INSERT INTO stu_02VALUES(3,'yuan',300);-- 该语句失败因为主键列没有300这个元素INSERT INTO classVALUES(300,'php')-- 执行完这一行上面那一行就可以执行了INSERT INTO stu_02VALUES(4,'ailun',100);	-- 主键的一个元素,可以包含对应外键多行数据(100班级,可以包含很多学生)INSERT INTO stu_02VALUES(5,'666',NULL) -- 当允许为空时,外键可以为空-- 有了主键外键关系的表,不能随意删除数据元素,只要主键有对应的外键数据,主键对应的数据行就不能删除
DELETE FROM classWHERE id = 100# 删除不成功,学生表里有100班的人,你不能100班就直接没了吧SELECT * FROM stu_02 

要删主表对应元素
要先删光从表对应数据行,然后就可以删除了

如果主表对应主键为unique修饰的可以为NULL
如果包含NULL,其实NULL对应数据行也可以直接删除

CHECK

在这里插入图片描述

# 演示check
# mysql 5的版本,不支持check,只做语法检测不会生效
CREATE TABLE t23(id INT PRIMARY KEY,`name` VARCHAR(32),sex VARCHAR(6) CHECK(sex IN('man','woman')),sal DOUBLE CHECK(sal>1000 AND sal<2000));
-- 添加数据
INSERT INTO t23VALUES (1,'tom','man',3000) -- 可以看到即使不符合CHECK的要求也能添加成功-- mysql5不支持CHECK
SELECT * FROM t23

在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...