学习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 VALUEINSERT 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 valueINSERT 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(三):数据类型&约束条件

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab实现DBO-ESN蜣螂算法优化回声状态网络多输入单输出回归预测

回归预测 | Matlab实现DBO-ESN蜣螂算法优化回声状态网络多输入单输出回归预测 目录 回归预测 | Matlab实现DBO-ESN蜣螂算法优化回声状态网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现DBO-ESN蜣螂算法优化回声状态网络多输入单输出…

【Python】理解WOE(Weight of Evidence)和IV(Information Value)

忠孝东路走九遍 脚底下踏著曾经你我的点点 我从日走到夜 心从灰跳到黑 我多想跳上车子离开伤心的台北 忠孝东路走九遍 穿过陌生人潮搜寻你的脸 有人走的匆忙 有人爱的甜美 谁会在意擦肩而过的心碎 🎵 动力火车《忠孝东路走九遍》 在信用评分和…

中国仓储物流装备产业链上最全产品资料大全(目前238家公司产品资料……)...

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 知识星球【智能仓储物流技术研习社】内已经收录了如下中国230多家仓储物流装备和技术相关产业链的公司的产品手册,请星球会员…

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

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

海外媒体宣发:新加坡.马来西亚如何在海外媒体投放新闻通稿-大舍传媒

导言 随着全球化的进程加速,海外市场对于企业的发展越来越重要。而在海外媒体上宣传企业的新闻通稿,成为了拓展海外市场和提升企业知名度的重要手段之一。本文将介绍大舍传媒对于如何在海外媒体上投放新闻通稿的经验和策略。 准备工作:了解…

随笔:贝特弹琴

半年前,我买了一架朗朗代言的智能电子琴。所谓智能是指,它配套的手机软件知道你在按哪个键,它还能让任意按键发光。用专业术语说,它的键盘具有输入和输出功能,和软件组合起来是一个完整的计算机系统。 随着软件练习曲…

运维别卷系列 - 云原生监控平台 之 05.prometheus alertManager 实践

文章目录 [toc]Alertmanager 简介Alertmanager 实现的核心概念GroupingInhibitionSilencesClient behaviorHigh Availability Alertmanager 配置文件globaltemplatesrouteinhibit_rulesreceivers Alertmanager 部署创建 cm创建 svc创建 stsPrometheus 配置告警Prometheus 配置文…

嵌入式单片机笔试题

DC-DC 和 LDO两者有何区别? DC-DC转换器(直流-直流转换器)和LDO(低压差线性稳压器)都是用于电源管理的设备,但它们在原理和特性上有一些显著的区别: 原理: DC-DC转换器通过改变输…

Android ndk获取手机内部存储卡的根目录方法

如下所示: 代码语言:javascript jclass envcls env- FindClass("android/os/Environment"); //获得类引用if (envcls nullptr) return 0;//找到对应的类,该类是静态的返回值是FilejmethodID id env- GetStaticMethodID(envcls,…

IP代理如何帮助SEO进行优化?

IP代理在SEO优化中扮演着重要的角色,它通过多种方式帮助提升网站的搜索排名和可见性。以下是IP代理如何帮助SEO进行优化的详细阐述: 第一点,数据采集与分析:在SEO过程中,大量的数据是必不可少的。通过使用IP代理&…

Pytorch学习笔记——Conv2d与Tensorboard的结合使用

文章目录 一、两者介绍及结合后的优势1、Conv2d简要介绍2、TensorBoard简要介绍3、结合后的优势 二、对之前代码进行改造1、引入相关包2、加载测试数据3、创建神经网络4、将信息写入Tensorboard 三、进行训练,启动Tensorboard 一、两者介绍及结合后的优势 1、Conv2…

数字人解决方案——ID-Animator可保持角色一致生成视频动画

一、引 言 个性化或自定义生成在图像和视频生成领域是一个不断发展的研究方向,尤其是在创建与特定身份或风格一致的内容方面。您提到的挑战和解决方案为这一领域提供了有价值的见解: 训练成本高:这是一个普遍问题,因为个性化生成…