当前位置: 首页 > news >正文

【Mysql】SQL约束、主键约束、非空、唯一、外键约束

SQL约束
什么是约束: 对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性. 违反约束的不正确数据,将无法插入到表中。
常见的约束
约束名 约束关键字
主键 primary key
唯一 unique
非空 not null
外键 foreign key
2.1 主键约束
什么是主键约束?
特点 :不可重复 、唯一 、非空
作用:用来标识数据库中的每一条记录
2.1.1 添加主键约束
语法格式
•字段名 字段类型 primary key

需求1: 创建一个带主键的表

-- 方式1 创建一个带主键的表
CREATE TABLE emp2(-- 设置主键 唯一 非空eid INT PRIMARY KEY,ename VARCHAR(20),sex CHAR(1)
);-- 删除表
DROP TABLE emp2;
-- 方式2 创建一个带主键的表
CREATE TABLE emp2(eid INT ,ename VARCHAR(20),sex CHAR(1),-- 指定主键为 eid字段PRIMARY KEY(eid)
);
-- 方式3 创建一个带主键的表
CREATE TABLE emp2(eid INT ,ename VARCHAR(20),sex CHAR(1)
)
-- 创建的时候不指定主键,然后通过 DDL语句进行设置
ALTER TABLE emp2 ADD PRIMARY KEY(eid);

DESC 查看表结构

-- 查看表的详细信息
DESC emp2;

在这里插入图片描述

测试主键的唯一性 非空性

-- 正常插入一条数据
INSERT INTO emp2 VALUES(1,'宋江','男');-- 插入一条数据,主键为空
-- Column 'eid' cannot be null 主键不能为空
INSERT INTO emp2 VALUES(NULL,'李逵','男');-- 插入一条数据,主键为 1
-- Duplicate entry '1' for key 'PRIMARY' 主键不能重复
INSERT INTO emp2 VALUES(1,'孙二娘','女');

哪些字段可以作为主键 ?
•通常针对业务去设计主键,每张表都设计一个主键id。
•主键是给数据库和程序使用的,跟最终的客户无关,所以主键没有意义,只要能够保证不重复就好。
2.1.2 删除主键约束
删除 表中的主键约束 (了解)

-- 使用DDL语句 删除表中的主键
ALTER TABLE emp2 DROP PRIMARY KEY;DESC emp2;

2.1.3 主键的自增
注: 主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值.
关键字:
•AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)

创建主键自增的表

-- 创建主键自增的表
CREATE TABLE emp2(-- 关键字 AUTO_INCREMENT,主键类型必须是整数类型eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20),sex CHAR(1)
);

添加数据 观察主键的自增

INSERT INTO emp2(ename,sex) VALUES('张三','男');
INSERT INTO emp2(ename,sex) VALUES('李四','男');
INSERT INTO emp2 VALUES(NULL,'翠花','女');
INSERT INTO emp2 VALUES(NULL,'艳秋','女');

2.1.4 修改主键自增的起始值
默认地 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下面的方式

-- 创建主键自增的表,自定义自增其实值
CREATE TABLE emp2(eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20),sex CHAR(1)
)AUTO_INCREMENT=100;-- 插入数据,观察主键的起始值
INSERT INTO emp2(ename,sex) VALUES('张百万','男');
INSERT INTO emp2(ename,sex) VALUES('艳秋','女');

2.1.5 DELETE和TRUNCATE对自增长的影响
•删除表中所有数据有两种方式
清空表数据的方式 特点
DELETE 只是删除表中所有数据,对自增没有影响
TRUNCATE truncate 是将整个表删除掉,然后创建一个新的表
自增的主键,重新从 1开始
测试1: delete 删除表中所有数据

-- 目前最后的主键值是 101
SELECT * FROM emp2;-- delete 删除表中数据,对自增没有影响
DELETE FROM emp2;-- 插入数据 查看主键
INSERT INTO emp2(ename,sex) VALUES('张百万','男');
INSERT INTO emp2(ename,sex) VALUES('艳秋','女');

测试2: truncate删除 表中数据

-- 使用 truncate 删除表中所有数据,
TRUNCATE TABLE emp2;-- 插入数据 查看主键
INSERT INTO emp2(ename,sex) VALUES('张百万','男');
INSERT INTO emp2(ename,sex) VALUES('艳秋','女');

2.2 非空约束
非空约束的特点: 某一列不予许为空
语法格式
•字段名 字段类型 not null
需求: 为 ename 字段添加非空约束

-- 非空约束
CREATE TABLE emp2(eid INT PRIMARY KEY AUTO_INCREMENT,-- 添加非空约束, ename字段不能为空ename VARCHAR(20) NOT NULL,sex CHAR(1)
);

2.3 唯一约束
唯一约束的特点: 表中的某一列的值不能重复( 对null不做唯一的判断 )
语法格式
•字段名 字段类型 unique
添加唯一约束

-- 创建emp3表 为ename 字段添加唯一约束
CREATE TABLE emp3(eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20) UNIQUE,sex CHAR(1)
);

测试唯一约束

-- 测试唯一约束 添加一条数据
INSERT INTO emp3 (ename,sex) VALUES('张百万','男');-- 添加一条 ename重复的 数据
-- Duplicate entry '张百万' for key 'ename' ename不能重复
INSERT INTO emp3 (ename,sex) VALUES('张百万','女');

主键约束与唯一约束的区别:
1.主键约束 唯一且不能够为空
2.唯一约束,唯一 但是可以为空
3.一个表中只能有一个主键 , 但是可以有多个唯一约束

2.4 外键约束
•FOREIGN KEY 表示外键约束,将在多表中学习。
2.5 默认值
默认值约束 用来指定某列的默认值
语法格式
•字段名 字段类型 DEFAULT 默认值
创建emp4表, 性别字段默认 女

-- 创建带有默认值的表
CREATE TABLE emp4(eid INT PRIMARY KEY AUTO_INCREMENT,-- 为ename 字段添加默认值ename VARCHAR(20) DEFAULT '奥利给',sex CHAR(1)
);

测试 添加数据使用默认值

-- 添加数据 使用默认值
INSERT INTO emp4(ename,sex) VALUES(DEFAULT,'男');
INSERT INTO emp4(sex) VALUES('女');-- 不使用默认值
INSERT INTO emp4(ename,sex) VALUES('艳秋','女');

相关文章:

  • html--404页面
  • Mybatis plus:IService接口
  • PyScada(四)构建用户 HMI
  • 亿联 AM610 M.2 SSD PCIE 3.0X2 128GB测评
  • NSIS 入门教程 (一)
  • mybatis框架相关问题总结(本地笔记搬运)
  • 这家民营银行起诉担保公司?暴露担保增信兜底隐患
  • 波兰出局奥地利无限可能,荷法无谓争小组第一,谁能小组第一?
  • 帕金森患者饮食指南:科学调养,呵护健康
  • 一般人不要学Python?一般人怎么学Python!!
  • Android studio在Ubuntu桌面上 创建桌面图标,以及导航栏图标
  • “论数据访问层设计技术及其应用”必过范文,软考高级,系统架构设计师论文
  • 【Pmac】PMAC QT联合开发中各种可能遇到的坑
  • C++之提高篇
  • 【数据结构】链表的大概认识及单链表的实现
  • create-react-app做的留言板
  • Date型的使用
  • ES6系列(二)变量的解构赋值
  • Java 23种设计模式 之单例模式 7种实现方式
  • PaddlePaddle-GitHub的正确打开姿势
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 番外篇1:在Windows环境下安装JDK
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 正则学习笔记
  • ![CDATA[ ]] 是什么东东
  • #每天一道面试题# 什么是MySQL的回表查询
  • (11)(2.1.2) DShot ESCs(四)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (南京观海微电子)——示波器使用介绍
  • (一)插入排序
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转载)hibernate缓存
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 使用反射注册事件
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET8使用VS2022打包Docker镜像
  • .NET导入Excel数据
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net后端程序发布到nignx上,通过nginx访问
  • /bin/bash^M: bad interpreter: No such file or directory
  • ?php echo ?,?php echo Hello world!;?
  • @NestedConfigurationProperty 注解用法
  • @Transactional事务注解内含乾坤?
  • @Validated和@Valid校验参数区别
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [Android]竖直滑动选择器WheelView的实现
  • [Asp.net mvc]国际化
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C#]扩展方法