第3章 数据定义语言DDL

文章目录

  • 第3章 DDL语言:数据定义语言
    • 3.1 MySQL的数据类型
    • 3.2 表的创建:create
    • 3.3 表的删除:drop
    • 3.4 快速创建表
    • 3.5 快速删除表中的数据:truncate
    • 3.6 修改表结构:alter
  • 第5章 约束
    • 5.1 非空约束:not null
    • 5.2 唯一性约束: unique
    • 5.3 主键约束:primary key
      • (1)使用表级约束,添加主键
      • (2)表中主键约束能两个吗
      • (3)auto_increment
    • 5.4 外键约束:foreign key

第3章 DDL语言:数据定义语言

DDL:数据定义语言:create(增)、drop(删)、alter(改)、truncate。主要是对表结构进行操作。

3.1 MySQL的数据类型

类型作用
varchar可变长的字符串类型,根据实际长度东忒分配空间。优点:节省空间。缺点:需要动态分配空间,速度慢。最长255
char定长字符串类型, 不管实际的数据长度是多少,分配固定长度的空间去存储数据。优缺点与上面相反。最长255
int整型。等同于java的int。最长11
bigint长整型。等同于java中的long。
float单精度浮点型
double双精度浮点型
date短日期类型
datetime长日期类型
clobCharacter Large OBject:CLOB。字符大对象, 最多存储4G的字符串。 超过255个字符的采用CLOB存储。 比如:存储一篇文章,一篇说明。
blobBinary Large OBject; 二进制大对象, 用来存储图片、声音、视频等流媒体数据。 BLOB类型字段上插入数据时,需要使用IO流。

varchar和char我们应该怎么选择?
性别字段选:性别是固定长度字符串,选择char。
姓名字段选:每个人名字长度不同,选择varchar。

例如:t_movie 电影表,存储电影信息

编号			   名字			故事情节			  上映日期			   时长			  海报				类型
no(bigint)	name(varchar)	history(clob)		playtime(date)		time(double)	image(blob)			type(char)
------------------------------------------------------------------------------------------------------------------
10000		   哪吒		    ..........			  2019-10-11		   2.5			   ....				 '1'
10001		   悟空传         ..........	         2019-11-11			  1.5			   ....				  '2'
....

3.2 表的创建:create

建表的语法格式create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);

create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型
);

表名:建议以t_ 或者 tbl_开始,可读性强。见名知意。
字段名:见名知意。
表名和字段名都属于标识符。

3.3 表的删除:drop

drop table t_student;             //注意:当这张表不存在的时候会报错!
drop table if exists t_student;   //两句都可以,推荐这句

实例:创建一个学生表,学号、姓名、年龄、性别、邮箱地址

mysql> create table t_student(-> no int,-> name varchar(32),-> sex char(1),-> age int(3),-> email varchar(255)-> );
Query OK, 0 rows affected (0.01 sec)

3.4 快速创建表

了解内容, 将查询结果当做一张表新建,实现表集数据的快速复制

mysql> create table emp2 as select * from emp;  //两张表的数据一模一样
Query OK, 14 rows affected (0.01 sec)
Records: 14  Duplicates: 0  Warnings: 0
mysql> create table mytable as select empno,ename from emp where job='MANAGER';
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from mytable;
+-------+-------+
| empno | ename |
+-------+-------+
|  7566 | JONES |
|  7698 | BLAKE |
|  7782 | CLARK |
+-------+-------+
3 rows in set (0.00 sec)

3.5 快速删除表中的数据:truncate

delete from dept_bak;      //这种删除数据的方式比较慢。

delete原理: 表中数据被删除了,但是数据在硬盘上的真实存储空间不会被释放!
缺点:删除效率比较低; 优点:支持回滚(即可恢复)

回滚实例

mysql> select * from dept_bak;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> delete from dept_bak;
Query OK, 4 rows affected (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.01 sec)mysql> select * from dept_bak;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

truncate原理:表被一次截断,物理删除。
缺点:不支持回滚。 优点:效率高,快速。

语法:truncate table dept_bak;

mysql> truncate table dept_bak;          //删数据,不是删表
Query OK, 0 rows affected (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from dept_bak;          //回滚也没用
Empty set (0.00 sec)

truncate删除速度很快,但是数据不可恢复。

注意:truncate是删除表中的数据,表还在。删除表用drop

3.6 修改表结构:alter

意思:添加一个字段,删除一个字段,修改一个字段!!!

第一:实际开发中,需求一旦确定,表一旦设计完成,很少对表结构修改。因为开发进行中修改结果成本较高,对应的java代码需要进行大量修改。这个责任应该由设计人员来承担!

第二:由于修改表结构操作很少,我们不需要掌握,如果真要修改,可以使用工具!

修改表结构操作不需要写到java程序中,也不是java程序员的范畴。

第5章 约束

constraint
在创建表时,可以给表中字段加上约束,来保证数据的完整性、有效性

约束包括哪些:

  1. 非空约束:not null

  2. 唯一性约束: unique

  3. 主键约束: primary key (PK)

  4. 外键约束:foreign key(FK)

  5. 检查约束:check(mysql不支持,oracle支持)

5.1 非空约束:not null

非空约束not null约束的字段不能为NULL。
not null 只有列级约束,没有表级约束

vip.sql,该文件为SQL脚本文件

drop table if exists t_vip;
create table t_vip(id int,name varchar(255) not null
);
insert into t_vip(id,name) values(1,'zhangsan');
insert into t_vip(id,name) values(2,'lisi');
mysql> source C:\Users\14051\Desktop\mysql_learning\document\vip.sql   //执行整个脚本文件
Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 1 row affected (0.00 sec)Query OK, 1 row affected (0.00 sec)

我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行!

你在实际的工作中,第一天到了公司,项目经理会给你一个xxx.sql文件,你执行这个脚本文件,你电脑上的数据库数据就有了!

5.2 唯一性约束: unique

唯一性约束unique约束的字段不能重复,但是可以为NULL。

drop table if exists t_vip;
create table t_vip(id int,name varchar(255) unique,   //name只能唯一email varchar(255)
);insert into t_vip(id,name,email) values(1, 'zhangsan', 'zhangsan@123.com');
insert into t_vip(id,name,email) values(2, 'lisi', 'lisi@123.com');
insert into t_vip(id,name,email) values(3, 'wangwu', 'wangwu@123.com');
mysql> insert into t_vip(id,name,email) values(4, 'wangwu', 'wangwu@163.com');   //名字不可以重复
ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'mysql> insert into t_vip(id) values(4);    //可以为NULL
Query OK, 1 row affected (0.00 sec)mysql> select * from t_vip;
+------+----------+------------------+
| id   | name     | email            |
+------+----------+------------------+
|    1 | zhangsan | zhangsan@123.com |
|    2 | lisi     | lisi@123.com     |
|    3 | wangwu   | wangwu@123.com   |
|    4 | NULL     | NULL             |
+------+----------+------------------+
4 rows in set (0.00 sec)

新需求:name和email两个字段联合起来具有唯一性!

drop table if exists t_vip;
create table t_vip(id int,name varchar(255),email varchar(255),unique(name,email) // 约束没有添加在列的后面,这种约束被称为表级约束。
);insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');
mysql> insert into t_vip(id,name,email) values(2,'zhangsan','zhangsan@163.com');
Query OK, 1 row affected (0.01 sec)mysql> select * from t_vip;
+------+----------+------------------+
| id   | name     | email            |
+------+----------+------------------+
|    1 | zhangsan | zhangsan@123.com |
|    2 | zhangsan | zhangsan@163.com |
+------+----------+------------------+
2 rows in set (0.00 sec)mysql> insert into t_vip(id,name,email) values(3,'zhangsan','zhangsan@123.com');
ERROR 1062 (23000): Duplicate entry 'zhangsan-zhangsan@123.com' for key 'name'

什么时候使用表级约束
需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束。

实例:unique 和not null可以联合

drop table if exists t_vip;
create table t_vip(id int,name varchar(255) not null unique  //联合使用);
mysql> desc t_vip;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(255) | NO   | PRI | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段。(注意:oracle中不一样!)

5.3 主键约束:primary key

重要内容

相关术语

  • 主键约束:一种约束。
  • 主键字段:该字段上添加了主键约束
  • 主键值:主键字段中的每一个值都叫主键值

什么是主键?有啥用?

主键值是每一行记录的唯一标识。键值是每一行记录的身份证号!

记住:任何一张表都应该有主键,没有主键,表无效!

主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)

怎么给一张表添加主键约束呢?

drop table if exists t_vip;
create table t_vip(id int primary key,    //列级约束name varchar(255));mysql> insert into t_vip(id,name) values(1,'z');
mysql> insert into t_vip(id,name) values(2,'a');
mysql> insert into t_vip(id,name) values(2,'s');    //不能重复
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'mysql> insert into t_vip(name) values('c');        //不能为空
ERROR 1364 (HY000): Field 'id' doesn't have a default value

(1)使用表级约束,添加主键

同样实现功能

create table t_vip(id int,name varchar(255),primary key(id)); //表级约束

表级约束主要是给多个字段联合起来添加约束

drop table if exists t_vip;
create table t_vip(id int,name varchar(255),email varchar(255),primary key(id,name)  // id和name联合起来做主键:复合主键!!!!
);mysql> insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');
mysql> insert into t_vip(id,name,email) values(1,'lisi','lisi@123.com');
mysql> insert into t_vip(id,name,email) values(1,'lisi','lisi@123.com');
ERROR 1062 (23000): Duplicate entry '1-lisi' for key 'PRIMARY'

在实际开发中不建议使用:复合主键。建议使用单一主键!
因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键可以做到。

(2)表中主键约束能两个吗

mysql> create table t_vip(-> id int primary key,-> name varchar(255) primary key);
ERROR 1068 (42000): Multiple primary key defined

结论:一张表,主键约束只能添加1个。(主键只能有1个。

主键值建议使用:int,bigint,char等类型。

不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的!

主键除了:单一主键和复合主键之外,还可以这样进行分类
自然主键:主键值是一个自然数,和业务没关系。
业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!

在实际开发中使用业务主键多,还是使用自然主键多一些?
自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。
因为主键一旦和业务挂钩,当业务发生变动时,会影响到主键值,所以业务主键不建议使用。

(3)auto_increment

在mysql当中,有一种机制,可以帮助我们自动维护一个主键值

create table t_vip(id int primary key auto_increment, //auto_increment表示自增,从1开始,以1递增!name varchar(255)
);insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
insert into t_vip(name) values('zhangsan');
mysql> select * from t_vip;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | zhangsan |
|  3 | zhangsan |
+----+----------+
3 rows in set (0.00 sec)

5.4 外键约束:foreign key

简称FK

业务背景:请设计数据库表,来描述“班级和学生”的信息

第一种方案:班级和学生存储在一张表中

t_student
no(pk)			name		classno			classname
----------------------------------------------------------------------------------
1				jack		  100			北京市大兴区亦庄镇第二中学高三12				lucy		  100			北京市大兴区亦庄镇第二中学高三13				lilei		  100			北京市大兴区亦庄镇第二中学高三14				hanmeimei	  100			北京市大兴区亦庄镇第二中学高三15				zhangsan	  101			北京市大兴区亦庄镇第二中学高三26				lisi		  101			北京市大兴区亦庄镇第二中学高三27				wangwu		  101			北京市大兴区亦庄镇第二中学高三28				zhaoliu		  101			北京市大兴区亦庄镇第二中学高三2

以上方案缺点:数据冗余,空间浪费!这个设计是比较失败的!

第二种方案:班级一张表、学生一张表

t_class 班级表
classno(pk)			      classname
------------------------------------------------------100					北京市大兴区亦庄镇第二中学高三1101					北京市大兴区亦庄镇第二中学高三1
t_student 学生表no(pk)			name		cno(FK引用t_class这张表的classno)
----------------------------------------------------------------1				jack				1002				lucy				1003				lilei				1004				hanmeimei		    1005				zhangsan			1016				lisi				1017				wangwu			    1018				zhaoliu			    101

当cno字段没有任何约束的时候,可能会导致数据无效。可能出现一个102,但是102班级不存在。
所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束。
那么:cno字段就是外键字段。cno字段中的每一个值都是外键值。

注意:
t_class是父表
t_student是子表

  • 删除表的顺序:先删子,再删父。
  • 创建表的顺序:先创建父,再创建子。
  • 删除数据的顺序:先删子,再删父。
  • 插入数据的顺序:先插入父,再插入子。
drop table if exists t_student;
drop table if exists t_class;create table t_class(classno int primary key,classname varchar(255)
);
create table t_student(no int primary key auto_increment,name varchar(255),cno int,foreign key(cno) references t_class(classno)
);insert into t_class(classno,classname) values(100,'北京市大兴区亦庄镇第二中学高三1班');
insert into t_class(classno,classname) values(101,'北京市大兴区亦庄镇第二中学高三1班');
insert into t_student(name,cno) values('jack',100);
insert into t_student(name,cno) values('lucy',100);
insert into t_student(name,cno) values('lilei',100);
insert into t_student(name,cno) values('hanmeimei',100);
insert into t_student(name,cno) values('zhangsan',101);
insert into t_student(name,cno) values('lisi',101);
insert into t_student(name,cno) values('wangwu',101);
insert into t_student(name,cno) values('zhaoliu',101);

思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
不一定是主键,但至少具有unique约束。

测试:外键可以为NULL吗?
外键值可以为NULL

mysql> insert into t_student(name,cno) values('zhaoliu',NULL);
Query OK, 1 row affected (0.00 sec)mysql> select * from t_student;
+----+-----------+------+
| no | name      | cno  |
+----+-----------+------+
|  1 | jack      |  100 |
|  2 | lucy      |  100 |
|  3 | lilei     |  100 |
|  4 | hanmeimei |  100 |
|  5 | zhangsan  |  101 |
|  6 | lisi      |  101 |
|  7 | wangwu    |  101 |
|  8 | zhaoliu   |  101 |
| 10 | zhaoliu   | NULL |
+----+-----------+------+
9 rows in set (0.00 sec)

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

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

相关文章

LeetCode:2009. 使数组连续的最少操作数(排序 Java)

目录 2009. 使数组连续的最少操作数 题目描述: 实现代码与解析: 排序 去重 双指针 原理思路: 滑动窗口 原理思路: 2009. 使数组连续的最少操作数 题目描述: 给你一个整数数组 nums 。每一次操作中&#xff0c…

点云从入门到精通技术详解100篇-基于激光点云和视觉融合的智能车前方障碍物检测(下)

目录 4 基于传感器信息融合的前方障碍物检测及跟踪 4.1 融合算法总体结构 4.2 传感器时空同步

C++:VS dump调试(2)

之前写的: C:VS2019调试dump文件-CSDN博客 1、需要dump文件【这个一般是客户现场收集的】 2、对应的pdb文件【这个是软件编译时候生成的】 3、代码【有可能只有自己负责模块的代码,没有全部代码,但是基本调试也是只会用到自己部…

IP协议中的四大支柱:DHCP、NAT、ICMP和IGMP的功能剖析

DHCP动态获取 IP 地址 我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的…

FPGA:图像数字细节增强算法(工程+仿真+实物,可用毕设)

目录 日常唠嗑一、视频效果二、硬件及功能1、硬件选择2、功能3、特点 未完、待续……四、工程设计五、板级验证六、工程获取 日常唠嗑 有2个多月没写文章了,又是老借口:“最近实在是很忙”🤣,不过说真,确实是比较忙&am…

DIY可视化UniApp表格组件

表格组件在移动端的用处非常广泛,特别是在那些需要展示结构化数据、进行比较分析或提供详细信息的场景中。数据展示与整理:表格是展示结构化数据的理想方式,特别是在需要展示多列和多行数据时。通过表格,用户可以轻松浏览和理解数…

java数据结构与算法刷题-----LeetCode238. 除自身以外数组的乘积

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 动态规划:左右乘积列表2. 滚动数组对动态规划过程…

老子云、AMRT3D、眸瑞科技

老子云概述 老子云3D可视化快速开发平台,集云压缩、云烘焙、云存储云展示于一体,使3D模型资源自动输出至移动端PC端、Web端,能在多设备、全平台进行展示和交互,是全球领先、自主可控的自动化3D云引擎。 平台架构 平台特性 1、基…

Open CASCADE学习|统计形状拓扑数量

边界表示法(Boundary Representation,简称B-Rep)是几何造型中最成熟、无二义的表示法。它主要用于描述物体的几何信息和拓扑信息。在边界表示法中,一个实体(Solid)由一组封闭的面(Face&#xff…

easyExcel - 按模板导出

目录 前言一、情景介绍二、文档介绍2.1 读取模板2.2 填充模板 三、代码示例3.1 案例一:工资表3.2 案例二:报价单 四、我所遇到的问题 前言 Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如…

VSCode配置AI自动补全插件Tabnine

面向软件开发人员的 AI 助手 使用 AI 代码完成更快地编写代码 什么是Tabnine Tabnine 是一款 AI 代码助手,可让您成为更好的开发人员。Tabnine 将通过所有最流行的编码语言和 IDE 的实时代码完成、聊天和代码生成来提高您的开发速度。 无论您将其称为 IntelliSens…

Java基础知识总结(45)

(3)类和对象 类是面向对象的重要内容,可以把类当做一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用类型变量。 (4)定义类 类是对一批对象的抽象,可以…

一文读懂CSS中的阴影:box-shadow,text-shadow,drop-shadow的区别与使用方式

一、区别 box-shadow 应用于元素,为元素本身添加阴影效果。 text-shadow 应用于文本,为文本内容添加阴影效果。 drop-shadow 是filter属性的一部分,通常用于图像,为其添加阴影效果。 二、box-shadow box-shadow属性用于为元素&…

无线局域网安全协议-WEP,WPA,WAPI,

目录 一、WEP(有线等效保密) 二、WPA(Wi-Fi网络安全接入) ​编辑 三、WAPI(无线局域网鉴别和保密基础结构) WLAN(Wireless Local Area Network)指应用无线通信技术将计算机设备互…

C语言程序的编译与链接

目录 1.翻译环境和运行环境2.翻译环境2.1 预处理(预编译)2.2 编译2.3 汇编2.4 链接 3.运行环境 1.翻译环境和运行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 翻译环境:在这个环境中源代码被转换为可执⾏的机器指令&am…

计算机网络(一)--网络发展和协议

网络发展和协议 计算机网络背景从独立模式到网络互联模式计算机网络发展七个阶段1. 批处理2. 分时系统3. 计算机之间的通信4. 计算机网络的产生5. 互联网的普及6. 以互联网技术为中心的时代7. 单纯建立连接 到 安全建立连接 协议例子:人与人之间的对话计算机中的协议 协议分层O…

Linux CentOS基础操作

Linux CentOS基础操作 1. 查看Linux服务器当前主机名等 hostname 2. 查看当前系统日期和时间 date -d -y 3. 显示网络接口信息,获取当前网卡状态,启动、停止网卡,网卡等闪烁显示30秒,配置网卡(网卡名称:eth1)的IP地址…

Redis主从同步机制

Redis主从同步机制是一种分布式数据库架构设计,用于确保主数据库(Master)和从数据库(Slave)之间的数据一致性,从而实现数据冗余、负载均衡、故障转移等功能。以下是Redis主从同步机制的关键要点&#xff1a…

每日OJ题_两个数组dp⑤_力扣10. 正则表达式匹配

目录 力扣10. 正则表达式匹配 解析代码 力扣10. 正则表达式匹配 10. 正则表达式匹配 难度 困难 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c…

springboot 整合 mybatis(配置版)

代码及配置整合 创建实体类,与数据库对应 创建 mapper、service 和 controller @AutowiredUserService userService;@ResponseBody@GetMapping("/user")public com.vazquez.bootstudy.model.User getById(@RequestParam("id") Long id) {return userServ…