学习MySQL(三):数据类型约束条件

数据类型

字符串:char(num) 与 varchar(num)

延申面试问题:char与varchar有什么区别?

区别1:定长与变长

    • char 固定长度,例如定义了char(8),则这一列存储的内容长度都为8,不足8位则会用空格补充(查询时是不会有空格的,mysql会对此进行处理)
    • varchar 可变长度,是指根据内容的长度进行存储

区别2:存储方式

    • char直接存储字符内容
    • varchar 开头由1-2个字符存储该字符的总长度,后面接着存储字符内容

总结:

    • char的存取数据很快,但由于是定长,当大部分内容没有达到规定长度时,会浪费不少空间资源;
    • varchar则不会,它根据实际长度存储,但由于存储的特殊形式造成存取速度不及char,当char存储的内容为一个定值时,则char不仅不浪费空间还提高了存取效果,因为varchar还要留出一部分存储字符串的长度;
    • 很早之前,大家都觉得varchar好,节省资源,但是到现在,磁盘资源已经不成问题,因此更倾向于选择char,也就是所谓的以空间换时间了。

整型:int 不需要指定字符的长度,能满足日常绝大部分的整数存储

浮点型:

  1. float(m,n) 单精度
  2. Double(m,n) 双精度
  3. decimal(m,n) 小数值

注:m代表总长度,包含小数部分。n代表小数长度,例如:float(5,3)表示小数位3,整数位为2的数值,总长度为5,例:32.234

-- 举个例子
-- 三者之间的区别
-- 四舍五入
CREATE TABLE test_tb ( NAME CHAR ( 8 ) NOT NULL, score1 FLOAT ( 5,2 ), score2 DOUBLE ( 5,2 ), score3 DECIMAL ( 5,2 ));
INSERT INTO test_tb VALUES ( "lisi", 45.2345, 45.2345, 45.2345 );
SELECT  * FROM  test_tb;


-- 使用默认值
CREATE TABLE test_tb1 ( NAME CHAR ( 8 ) NOT NULL, score1 FLOAT, score2 DOUBLE, score3 DECIMAL );
INSERT INTO test_tb1 VALUES ( "zhangsan", 99.1234567, 99.1234567, 99.1234567 );
SELECT * FROM test_tb1;

总结:

  • double默认比float更精确;
  • decimal默认存储的时decimal(10,0),实际存储的是字符串类型;
  • 日常使用float就可以解决大部分问题了。

日期时间:

  1. date 日期
  2. datetime 日期时间
-- 举个例子
CREATE TABLE test_tb2 ( ruxue date, kaixue datetime );
INSERT INTO test_tb2
VALUES
  ( "2022-08-09 06:56:00", "2022-09-01 06:56:00" );
SELECT * FROM test_tb2;

枚举:

  1. Enum 单选,例如:性别
  2. set 多选 例如:爱好
-- 举个例子
CREATE TABLE test_tb3 (
  sex enum ( "男", "女" ),
  hobby 
SET ( "运动", "阅读", "旅行" ));
INSERT INTO test_tb3
VALUES
  ( "男", "运动,旅行" ),
  ( "女", "运动" );
SELECT * FROM test_tb3;

约束条件

为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。

约束条件与数据类型的宽度一样,都是可选参数。

primary key:主键,指定该列的值可以唯一地表示该列记录

主键为了保证表中的每一条数据的该字段都是表格中的唯一值。换言之,它是用来独一无二地确认一个表格中的每一行数据。

-- 举个例子
CREATE TABLE test_tb4 (
  id INT PRIMARY KEY,
NAME CHAR ( 10 ));
INSERT INTO test_tb4 ( NAME )
VALUES
  ( "张三" );
报错内容:ERROR 1364 ( HY000 ): Field 'id' doesn’t have a DEFAULT VALUE


INSERT INTO test_tb4
VALUES
  ( 1, "张三" ),(
    1,
    "李四" 
  );
-- 报错内容:ERROR 1062 ( 23000 ): Duplicate entry '1' for key 'test_tb4.PRIMARY'

联合主键

CREATE TABLE test_tb5 (
  id INT,
  NAME CHAR ( 10 ),
PRIMARY KEY ( id, NAME ));
INSERT INTO test_tb5
VALUES
  ( 1, '张三' ),(
    1,
    '李四' 
  );
INSERT INTO test_tb5
VALUES
  ( 1, '张三' );
-- 报错内容:ERROR 1062 - Duplicate entry '1-张三' for key 'test_tb5.PRIMARY'

了解内容:auto_increment

CREATE TABLE test_tb6 (  id INT PRIMARY KEY auto_increment, NAME CHAR ( 8 ));
INSERT INTO test_tb6 ( NAME ) VALUES ( '张三' ),( '李四' ),( '王五' );

not mull:非空约束,指定某列不能为空

unique:唯一约束,指定某列或几列组合不能重复

-- 举个例子
CREATE TABLE test_tb7 ( NAME CHAR ( 8 ) UNIQUE );
INSERT INTO test_tb7 VALUES ( "张三" );
INSERT INTO test_tb7 VALUES (  "张三" );
-- 报错信息:ERROR 1062 (23000): Duplicate entry '张三' for key 'test_tb7.NAME' 
联合唯一,只有当你设置的这些字段同时重复时才会报错
CREATE TABLE test_tb8 ( NAME CHAR ( 8 ), class CHAR ( 5 ), UNIQUE ( NAME, class ));
INSERT INTO test_tb8 VALUES ( "张三", "五年级" );
INSERT INTO test_tb8 VALUES ( "张思", "五年级" );


INSERT INTO test_tb8 VALUES ( "张三", "五年级" );
-- 报错信息:ERROR 1062 - Duplicate entry '张三-五年级' for key 'test_tb8.NAME'

default:默认值,对于性别一列,如果大部分都是男性,可以设置为默认值,不填则取默认值,填写了则覆盖默认值

-- 举个例子
CREATE TABLE test_tb9 ( id INT NOT NULL, NAME CHAR ( 8 ), sex enum ( "男", "女" ) DEFAULT "男" );
DESC test_tb9;
INSERT INTO test_tb9 ( sex ) VALUES ( "男" );
-- 报错信息:1364 - Field 'id' doesn't have a default value


INSERT INTO test_tb9 ( id, sex ) VALUES ( 1, "男" );
INSERT INTO test_tb9 ( id, NAME ) VALUES ( 1, "张三" );
SELECT * FROM test_tb9;
INSERT INTO test_tb9 VALUES ( 1, "张三", "女" );

foreign key:外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性

多表联查进行关联的约束条件

假设我们要描述所有公司的员工,需要描述的属性有:工号、姓名、部门

公司有3个部门,但是有1个亿的员工,那意味着这个字段需要重复存储,部门名字越长,越浪费空间

解决方法:我们完全可以定义一个部门表,然后让员工信息表关联该表,如何关联,即foreign key

前提条件:类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一

-- 举个例子
CREATE TABLE dep (
  id INT PRIMARY KEY auto_increment,
dep_name CHAR ( 10 ));
CREATE TABLE emp (
  id INT PRIMARY KEY auto_increment,
  NAME CHAR ( 8 ),
  dep_id INT,
FOREIGN KEY ( dep_id ) REFERENCES dep ( id ));


-- 级联更新、级联删除
CREATE TABLE emp1 (
  id INT PRIMARY KEY auto_increment,
  NAME CHAR ( 8 ),
  dep_id INT,
FOREIGN KEY ( dep_id ) REFERENCES dep ( id ) ON DELETE CASCADE ON UPDATE CASCADE
);

练习题

-- 创建订单库
CREATE DATABASE db_order;
USE db_order;


-- 创建订单表
CREATE TABLE hy_order_2021 ( id VARCHAR ( 100 ), order_money FLOAT ( 6, 2 ), member_id INT, create_time datetime, STATUS INT );


-- 创建订单明细表
CREATE TABLE hy_orderitem_2021 (
  id VARCHAR ( 100 ),
  order_id VARCHAR ( 100 ),
  item_id INT,
  item_name VARCHAR ( 200 ),
  price FLOAT ( 4, 1 ),
item_num INT 
);

知识点一

  • 命名库名与表名的时候,一般是:以字母开头。
  • 可以包括:字母、数字、下划线。
  • MSYQL命名,不管表与数据库名称均不区分大小写DB_DEMO 与db_demo。

知识点二

在客户端,生成表名,在左边的库列表没有找到新建的数据库,是因为有客户端缓存,选中数据库,右键刷新一下即可。

知识点三

数据类型:一般数值型:整型,浮点型,日期/时间型;字符/文本型。

来自: 学习MySQL(三):数据类型&约束条件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二分答案(区间范围)

D. Jumping Through Segments 输入数据 4 5 1 5 3 4 5 6 8 10 0 1 3 0 2 0 1 0 3 3 3 8 10 18 6 11 4 10 20 0 5 15 17 2 2 输出范围 7 0 5 13#include<bits/stdc.h> #define int long long using namespace std; typedef pair<char,int>PII; const int N2e510;…

Java线程生命周期:Java线程生命周期全景解读

1. 线程生命周期概述&#xff1a;不仅仅是状态转换 在多线程编程中&#xff0c;理解线程的生命周期对于编写有效、高效的代码至关重要。线程生命周期通常描述了线程从创建到死亡的一系列状态变化过程&#xff0c;但其实不仅仅局限于这些状态的简单转换。线程生命周期的理解应该…

如何在云电脑实现虚拟应用—数据分层(应用分层)技术简介

如何在云电脑实现虚拟应用—数据分层&#xff08;应用分层&#xff09;技术简介 近几年虚拟化市场实现了非常大的发展&#xff0c;桌面虚拟化在企业中应用越来越广泛&#xff0c;其拥有的如下优点得到大量企业的青睐&#xff1a; 数据安全不落地。在虚拟化环境下面数据保存在…

网络安全快速入门(十)MySQL拓展操作

10.1.0前言 前面我们已经对用户操作以及库&#xff0c;表操作有了基础的认识&#xff0c;接下来我们来在之前已经学过的一些操作进行进一步拓展&#xff0c;本章我们主要了解以下几个知识点&#xff1a; 数据库设计方法视图存储过程事务 我们开始本章的内容吧 10.2 数据库设计方…

Java代理模式的实现详解

一、前言 1.1、说明 本文章是在学习mybatis框架源码的过程中&#xff0c;发现对于动态代理Mapper接口这一块的代理实现还是有些遗忘和陌生&#xff0c;因此在本文章中就Java实现代理模式的过程进行一个学习和总结。 1.2、参考文章 《设计模式》&#xff08;第2版&#xff0…

阿里云服务器下,部署LNMP环境安装wordpress

目录 1 LNMP部署1、简单说明2、nginx部署3、php8 安装4、mysql8安装5、配置 nginx 实现支持 PHP 程序6、安装 php 组件7、测试 2 wordpress部署1、安装2、配置 总结 1 LNMP部署 1、简单说明 首先需要明白&#xff0c;LNMP指的是Linux、Nginx、MySQL、PHP。而如果使用阿里云服…

代码随想录—— 填充每个节点的下一个右侧节点指针(Leetcode116)

题目链接 层序遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node _right, Node _next) {val _val;left _…

视频提取动图怎么制作?一个方法将视频转换gif

现在这个日益发展的科技社会&#xff0c;视频作为我们广泛应用的一种媒体形式&#xff0c;在各个领域都扮演着重要的角色。视频凭着丰富生动的内容成为传递信息的媒介。但是视频的体积也是比较大的&#xff0c;在使用的过程中会受到各种各样的限制。这个时候就可以使用gif在线制…

根据Word文档用剪映批量自动生成视频发布抖音

手头有大量word文档&#xff0c;想通过剪映的AI图文成片功能批量生成视频&#xff0c;发布到抖音平台&#xff0c;简单3步即可&#xff1a; 第一步&#xff1a;把word文档或者PDF等文档转成txt文本&#xff0c;可以用一些软件&#xff0c;也可以用AI工具&#xff0c;具体常见文…

LLM Agent智能体综述(超详细)

前言 &#x1f3c6;&#x1f3c6;&#x1f3c6;在上一篇文章中&#xff0c;我们介绍了如何部署MetaGPT到本地&#xff0c;获取OpenAI API Key并配置其开发环境&#xff0c;并通过一个开发小组的多Agent案例感受了智能体的强大&#xff0c;在本文中&#xff0c;我们将对AI Agent…

《灵摆疗法》PDF完整版阅读

译者序 神奇丶快速又有效的灵摆疗法 2008年当我开始走上自己的灵性道路时就与灵摆结下了不解之缘当时我非常热衷于水晶疗愈所以疯狂地搜集各种不同的矿石学习如何将矿石 和水晶灵摆连结起来做能量疗愈后来在我开设马雅心能量课程时也会教大家如何使用水晶灵摆 …然而这两年来不…

Python GUI开发- PyQt5 开发小工具环境入门

前言 常见的python开发gui的库有 Tkinter&#xff0c; PyQt5&#xff0c; wxPython等。本教程是选择PyQt5 开发桌面小工具。 环境准备 只需pip安装即可快速准备好开发环境 pip install pyqt5快速开始 创建一个空的window窗口 Qapplication()&#xff1a;每个GUI都必须包含…

SpringBoot--@Autowired注入HttpServletRequest是否线程安全?

原文网址&#xff1a;SpringBoot--Autowired注入HttpServletRequest是否线程安全&#xff1f;_IT利刃出鞘的博客-CSDN博客 简介 本文用实例结合源码来说明Autowired注入HttpServletRequest是线程安全的。 SpringBoot获取HttpServletRequest有多种方式&#xff0c;见&#xf…

免费思维13招之十二:耗材型思维

免费思维13招之十二:耗材型思维 今天给你分享免费思维的两个子思维——相关性耗材思维和非相关性耗材思维。 相关性耗材思维,是指有一些产品的使用,需要大量的相关耗材,从而对该产品进行免费,而耗材进行资费。 举例:全世界最大的一家直销公司叫安利,它的明星产品是净水…

Axure网上超市用户端APP原型 (O2O生鲜电商/买菜到家/数字零售/京东到家/抖音超市领域)

作品概况 页面数量&#xff1a;共 100 页 源文件格式&#xff1a;rp格式&#xff0c;兼容 Axure RP 9/10&#xff0c;非程序软件无源代码 适用领域&#xff1a;O2O生鲜电商、网上超市、买菜到家、数字零售 作品特色 本作品为网上超市用户消费端Axure交互原型&#xff0c;属于…

BUUCTF——大流量分析一、二、三题

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

Spring Boot:异常处理

Spring Boot 前言使用自定义错误页面处理异常使用 ExceptionHandler 注解处理异常使用 ControllerAdvice 注解处理异常使用配置类处理异常使用自定义类处理异常 前言 在 Spring Boot 中&#xff0c;异常处理是一个重要的部分&#xff0c;可以允许开发者优雅地处理应用程序中可…

Spring WebFlux 初探-响应式编程-021

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

[HUBUCTF 2022 新生赛]ezsql

测试无结果 扫描目录&#xff0c;得到源码 找到注入点 思路&#xff1a;更新资料的时候可以同时更新所有密码 我们需要知道密码的字段名 爆库 nicknameasdf&age111,description(select database())#&descriptionaaa&token31ad6e5a2534a91ed634aca0b27c14a9 爆表…

外网ip地址怎么获取?快解析

大家都清楚互联网是通过ip地址通信的&#xff0c;ip地址又分内网ip和外网ip。内网ip只能在内网使用&#xff1b;而外网ip作为电脑唯一标识&#xff0c;可在公网使用。那么外网ip地址怎么获取呢&#xff1f; 外网ip是网络运营商分配给用户的。目前最常见的两种上网方式一个是拉…