[MySQL]表的创建、修改与删除

2023-11-16

在这里插入图片描述



1. MySQL中的数据类型

在这里插入图片描述

1.1 常用的数据类型

在这里插入图片描述

2. 创建表

创建表必须具备CREATE TABLE权限和存储空间

2.1 方式一:创建空的新表

2.1.1 新表的创建

语法:

CREATE TABLE [IF NOT EXISTS] 表名( 
	字段1, 数据类型 [约束条件] [默认值], 
	字段2, 数据类型 [约束条件] [默认值], 
	字段3, 数据类型 [约束条件] [默认值], 
	……
	[表约束条件] 
);

加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表;如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。

  • 必须指定:
    • 表名
    • 列名(或字段名),数据类型,长度
  • 可选指定:
    • 约束条件
    • 默认值
# 使用 mytest3 数据库
USE mytest3;
SELECT DATABASE();

在这里插入图片描述

CREATE TABLE IF NOT EXISTS myemp1 (
    # id int类型
    id INT,
    # 员工姓名 字符类型,最长15个字符
    # 使用VARCHAR必须指明长度
    emp_name VARCHAR(15),
    # 雇佣时间 日期类型
    hire_date DATE
);

2.1.2 查看表结构

DESC myemp1;

在这里插入图片描述

2.1.3 查询创建表的语句

SHOW CREATE TABLE myemp1;

在这里插入图片描述

如果创建表的时候没有指明使用的字符集,则默认使用表所在的数据库的字符集

2.2 方式二:基于现有的表创建表

基于现有的表创建新的表,新的表的字段名和数据类型都和基于的现有表一致。

语法:

CREATE TABLE 将要新建的表名
AS
查询现有表的SELECT语句

查询语句查询出来的数据,会放入新建的表中

USE atguigudb;
CREATE TABLE myemp2
AS
SELECT employee_id,
       last_name,
       salary
FROM employees;
SELECT * FROM myemp2;

在这里插入图片描述

DESC myemp2;
DESC employees;

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

如果查询语句中有指定字段的别名,那么新的表的字段名就使用指定的别名,否则使用原表的字段名。

CREATE TABLE myemp3
AS
SELECT employee_id emp_id,
       last_name emp_name,
       salary
FROM employees;
SELECT * FROM myemp3;

在这里插入图片描述

2.3 练习

2.3.1 练习1

创建一个表employees_copy,实现对employees表的复制,包括表数据

# 创建一个表employees_copy,实现对employees表的复制,包括表数据
CREATE TABLE employees_copy
AS
SELECT * FROM employees;

SELECT * FROM employees_copy;

在这里插入图片描述

2.3.2 练习2

创建一个表employees_blank,实现对employees表的复制,不包括表数据

# 创建一个表employees_blank,实现对employees表的复制,不包括表数据
CREATE TABLE employees_blank
AS
# 实现对employees表的复制,不包括表数据
# 只需要查询出来的数据为空即可
SELECT *
FROM employees
# 由于该条件一定为false,所以查询出来的数据一定为空
WHERE 1 = 0;

SELECT * FROM employees_blank;

在这里插入图片描述

3. 修改表

修改表,使用ALTER TABLE语句。

3.1 添加字段

语法:

ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型 [FIRST|AFTER 字段名];

3.1.1 添加一个字段

给myemp1添加一个字段。

USE mytest3;
DESC myemp1;

ALTER TABLE myemp1
# 添加一个字段,字段名为salary,数据类型为double,
# 且位数为10位,其中小数位数占2位,整数部分10位
# 新字段默认添加到表的最后
ADD COLUMN salary DOUBLE(10, 2);

DESC myemp1;

在这里插入图片描述

3.1.2 添加字段到指定位置

ALTER TABLE myemp1
# 将新的字段添加到emp_name字段后
ADD phone_num VARCHAR(20) AFTER emp_name;

DESC myemp1;

在这里插入图片描述

3.2 修改字段

对表的字段进行修改,可以修改字段的数据类型、长度、默认值、位置等。

一般修改字段不会修改字段的数据类型,修改字段的数据类型很可能影响原本的数据。

语法:

ALTER TABLE 表名 
MODIFY [COLUMN] 字段名1 字段类型 [DEFAULT 默认值] [FIRST|AFTER 字段名 2];

3.2.1 修改字段的长度

ALTER TABLE myemp1
# 将emp_name字段的长度修改为25
MODIFY emp_name VARCHAR(25);

DESC myemp1;

在这里插入图片描述

3.2.2 修改字段的同时设置默认值

ALTER TABLE myemp1
# 将emp_name字段的长度修改为35
# 同时指定默认名字为张三
MODIFY emp_name VARCHAR(35) DEFAULT '张三';

DESC myemp1;

在这里插入图片描述

3.2.3 修改字段的位置

ALTER TABLE myemp1
# 将emp_name字段的长度修改为25
# 同时字段位于phone_num之后
# 不能单独设置字段的位置,即不能只写AFTER phone_num
MODIFY emp_name VARCHAR(25) AFTER phone_num;

DESC myemp1;

在这里插入图片描述

3.3 重命名字段

语法:

ALTER TABLE 表名 CHANGE [column] 列名 新列名 新数据类型;
ALTER TABLE myemp1
CHANGE salary monthly_salary double(10,2);

DESC myemp1;

在这里插入图片描述

3.4 删除字段

语法:

ALTER TABLE 表名 DROP [COLUMN] 字段名
ALTER TABLE myemp1
DROP phone_num;

DESC myemp1;

在这里插入图片描述

4. 重命名表

4.1 方式一:RENAME

语法:

RENAME TABLE 旧表名 TO 新表名;
RENAME TABLE myemp1 TO emp1;

SHOW TABLES;

在这里插入图片描述

4.2 方式二:ALTER

语法:

ALTER table 要修改的表 RENAME [TO] 新表名;
ALTER TABLE emp1
RENAME myemp1;

SHOW TABLES;

在这里插入图片描述

5. 删除表

语法:

DROP TABLE [IF EXISTS] 数据表1 [, 数据表2,, 数据表n];
USE atguigudb;

DROP TABLE IF EXISTS employees_blank;

SHOW TABLES;

在这里插入图片描述

数据表删除之后,不能撤销删除操作。
不光将表结构删除掉,同时表中的数据也删除掉,释放表空间。即数据和结构都被删除。

6. 清空表

清空表,表示清空表中的所有数据,但是表结构保留。

语法:

TRUNCATE TABLE 表名;
TRUNCATE TABLE employees_copy;

SELECT * FROM employees_copy;

在这里插入图片描述

6.1 TRUNCATE TABLE与DELETE FROM的对比

  • 相同点:
    • 都可以实现对表中所有数据的删除,同时保留表结构。
  • 不同点:
    • TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
    • DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚的(COMMIT之前)。

7. DCL中的COMMIT与ROLLBACK

  • COMMIT:
    • 提交数据。
    • 一旦执行COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
  • ROLLBACK:
    • 回滚数据。
    • 一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT之后。

阿里开发规范:
【参考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句
说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

8. DDL 与 DML 说明

  • DDL
    • DDL的操作一旦执行,就不可回滚。
    • 指令SET autocommit = FALSE对DDL操作失效。(因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE影响的。)
  • DML
    • DML的操作默认情况,一旦执行,也是不可回滚的。DML执行完成默认会执行一次COMMIT。
    • 如果在执行DML之前,执行了SET autocommit = FALSE,则执行的DML操作就可以实现回滚。

8.1 演示

8.1.1 DML

# 为了避免之前的操作造成影响,先提交一次
COMMIT;
# 查询myemp3中的数据
SELECT * FROM myemp3;

在这里插入图片描述

# 取消DML操作的自动提交
SET AUTOCOMMIT = FALSE;
# 使用DELETE FROM清空myemp3中的数据
DELETE FROM myemp3;
# 再次查询myemp3
SELECT * FROM myemp3;

在这里插入图片描述

# 进行数据的回滚
ROLLBACK;
# 再次查询myemp3
# 由于没有提交清空操作所以可以进行数据的回滚
SELECT * FROM myemp3;

在这里插入图片描述

在执行DML之前,执行了SET autocommit = FALSE,则执行的DML操作就可以实现回滚。

8.1.2 DDL

# 为了避免之前的操作造成影响,先提交一次
COMMIT;

# 查询myemp3中的数据
SELECT * FROM myemp3;

在这里插入图片描述

# 取消DML操作的自动提交
SET AUTOCOMMIT = FALSE;

# 使用TRUNCATE TABLE清空myemp3中的数据
TRUNCATE TABLE myemp3;

# 再次查询myemp3
SELECT * FROM myemp3;

在这里插入图片描述

# 进行数据的回滚
ROLLBACK;

# 再次查询myemp3
# 由于执行的为DDL操作,所以不能进行数据的回滚
SELECT * FROM myemp3;

在这里插入图片描述

DDL的操作一旦执行,就不可回滚。且指令SET autocommit = FALSE对DDL操作无效。

9. 阿里MySQL命名规范

  • 【 强制 】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
    • 正例:aliyun_admin,rdc_config,level3_name
    • 反例:AliyunAdmin,rdcConfig,level_3_name
  • 【 强制 】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。
  • 【 强制 】表必备三字段:id, gmt_create, gmt_modified。
    • 说明:其中 id 必为主键,类型为BIGINT UNSIGNED、单表时自增、步长为 1。gmt_create, gmt_modified 的类型均为 DATETIME 类型,前者现在时表示主动式创建(最开始[第一次]添加数据的时间),后者过去分词表示被动式更新(后期对数据进行修改的时间)
  • 【 推荐 】表的命名最好是遵循 “业务名称_表的作用”。
    • 正例:alipay_task 、 force_project、 trade_config
  • 【 推荐 】库名与应用名称尽量一致。
  • 【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
    • 正例:无符号值可以避免误存负数,且扩大了表示范围。
    • 在这里插入图片描述

10. MySQL8新特性—DDL的原子化

在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,即 DDL操作要么成功要么回滚 。

CREATE DATABASE mytest; 

USE mytest; 

CREATE TABLE book1( 
	book_id INT , 
	book_name VARCHAR(255) 
);

SHOW TABLES;

在这里插入图片描述

由于删除两种表为同一个事务,在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,所以删除第二个表失败时会进行事务的回滚,撤销对表1的删除。因为在删除表2失败时并没有整个事务执行成功,所以会回滚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[MySQL]表的创建、修改与删除 的相关文章

  • 导入 CSV 以更新表中的行

    大约有 26K 个产品 帖子 每个产品都有如下元值 post id 列是数据库中的产品 ID sku meta key 是每个产品的唯一 ID 我收到了一个新的 CSV 文件 该文件更新了每个产品的 sale price meta key
  • Python SQLite3 SQL注入漏洞代码

    我知道下面的代码片段由于 format 的原因很容易受到 SQL 注入的攻击 但我不知道为什么 有谁明白为什么这段代码容易受到攻击以及我从哪里开始修复它 我知道这些代码片段使输入字段保持打开状态 以便通过 SQL 注入执行其他恶意命令 但不
  • MySQL获取最后10条记录中的第一条记录

    在Mysql中 我试图获取最后10条记录中最旧的记录 为了得到最后 10 个我会简单地做SELECT FROM table ORDER BY id DESC LIMIT 10 为了获得最旧的 我只需使用 ASC 顺序 我需要首先按 DESC
  • 使用另一个表中的数据查找并替换 MySQL 中的字符串

    我有两个 MySQL 表 我想使用另一个表中的数据查找和替换一个表中的文本字符串 Table texts messages thx guys i think u r great thx again u rock Table dictiona
  • 从多个表中选择 - 一对多关系

    我有这样的表 表产品 身份证 姓名 表格图像 产品 ID 网址 订单号 表价 产品 ID 组合 货币 价格 表数量 产品 ID 组合 数量 表 Product 与其他表是一对多关系 我需要查询表并得到类似这样的结果 伪数组 ProductI
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont
  • 如何在没有 EF 的 ASP.NET MVC 中使用普通 sql?

    我有一个使用 linq to sql 的类 如何在 ASP NET MVC 3 中使用普通 sql 而不使用 EF 来实现相同的功能 public ActionResult Index var List from c in db OFFIC
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • 如何在 Windows 上安装 PHP 的 PDO 驱动程序?

    我在 Windows 服务器上安装了 Apache PHP 5 6 和 MySQL 5 7 在 php ini 中 我启用了以下内容 extension php mysql dll extension php mysqli dll exte
  • 如何在 MariaDB 10 中启用大索引?

    在 Debian Jessie 中 我安装了 MariaDB 服务器 10 0 30 并尝试增加最大密钥长度 AFAIU 这取决于配置参数innodb large prefix正在启用 根据docs https mariadb com kb
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • 为 Mariadb 安装连接器 C

    所以 我想使用 Mariadb 有一个连接器 C https downloads mariadb org connector c https downloads mariadb org connector c 我该如何安装它 坦白说 它的文
  • 使用 PHP 代码和 HTML 表单将 Excel (.csv) 导入 MySQL

    我知道还有其他类似的帖子 但每个人都建议直接在 PHPMyAdmin 中将其导入 MySQL 这工作完美 但我需要通过 HTML 表单导入 PHP 到 MySQL 我想要一个收集文件的 HTML 表单 然后将该文件传递给 PHP 脚本 我想
  • 使用 mysql2 gem 获取最后插入的 id

    我有这样的代码 require mysql2 db query insert into clients Name values client 我可以通过 1 个查询返回最后插入的 ID 吗 您可以使用last id客户端实例的方法 clie
  • 使用绑定和空值命中 Oracle 索引的最佳查询

    我有一个表 该表在多个列上有一个索引 其中许多列可以为空 CREATE UNIQUE INDEX UX MYTABLE A B C D E ON MYTABLE A B C D E 现在 我在 C 代码中尝试检查该表并精确命中索引 对于每个
  • 显示过去 7 天 PHP 的结果

    我想做的是显示过去 30 天的文章 但我现有的代码不断给我一个 mysql fetch assoc 错误 然后追溯到我的查询 这是代码 sql mysql query SELECT FROM table WHERE DATE datetim
  • PDO fetch() 失败时会抛出异常吗?

    有没有方法PDO语句 fetch http php net manual en pdostatement fetch php如果 PDO 错误报告系统设置为抛出异常 则在失败时抛出异常 例如 如果我设置 PDO ATTR ERRMODE g
  • 在mysql中搜索“SanF”时获取旧金山的记录

    当我搜索 SanF 时获得 San Francisco 记录 SELECT FROM table WHERE col LIKE san Works SELECT FROM table WHERE col LIKE san F Works S
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我

随机推荐

  • 如何画出一张合格的技术架构图?

    阿里妹导读 技术传播的价值 不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径 加速业务的上线速率 也体现在优秀工程师在工作效率提升 产品性能优化和用户体验改善等经验方面的分享 以提高我们的专业能力 接下来 阿里巴巴技术专家三画
  • 使用Vue过滤器格式化日期时间

    学习目标 掌握Vue过滤器 created mounted beforeDestory 等函数 学习内容 Vue过滤器 created mounted beforeDestory 实现思路 1 使用Vs code创建demo html文件
  • php下载xlsx到本地,Laravel 5.8 实现Excel 下载(将信息数据导出成Excel下载到本地)...

    目的 实现将数据表信息导出成Excel下载到本地 注 我这里用Laravel 版本 5 8 框架中实现并讲解 在laravel使用第3方插件库来完成此项工作 下面我为大家提供3个链接 供大家参考 1 Excel插件库 2 Excel官网 3
  • Mina框架及接口开发

    Mina是NIO实现的一个架构 可以通过它快速开发网络通信 中间件等服务端程序 IOService接口 描述服务端和客户端接口 子类是connector和Acceptor分别用于描述客户端和服务端 IOproceser 多线程环境来处理我们
  • 【Vue2从入门到精通】Vue监听器watch,计算属性computed,方法methods的区别及使用场景

    文章目录 人工智能福利文章 前言 Vue 监听器 watch 定义及作用 示例 使用场景 Vue 计算属性 computed 定义及作用 示例 使用场景 Vue 方法 methods 定义及作用 示例 使用场景 总结 脑筋急转弯小程序抢先体
  • echarts 根据实际数据改变仪表盘颜色

    情景 实际值 gt 计划值 仪表盘颜色显示 绿色表示超过预期 相反则表示未达到预期 如图 js 控制 方法 if factVal gt planVal curOption series 1 axisLine lineStyle color
  • React中实现tab切换

    代码比较简单 并不复杂 import React Component from react class Taball extends Component constructor props super props this state cu
  • 【ML特征工程】第 3 章 :文本数据:扁平化、过滤和分块

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • MATLAB算法实战应用案例精讲-【数模应用】KMP字符串匹配(附C语言和Java代码)

    目录 前言 几个高频面试题目 KMP 算法和暴力匹配算法之间的区别 和动态规划有什么关系
  • eolinker搭建(Linux版)

    1 什么是eolinker Eolinker是一个api管理平台 可满足各行业客户在不同应用环境中对接口管理全生命周期的个性化需求 提供API开发管理 开发团队协作 自动化测试 网关以及监控等服务 帮助企业实现开发运维一体化 提升开发速度并
  • 极速版RPS选股,一秒出结果的方案是如何实现的!股票量化分析工具QTYX-V2.5.3...

    概述RPS选股策略 在国内大家可能对彼得 林奇 Peter Lynch 沃伦 巴菲特 Warren E Buffett 这些华尔街 wall street 的金融大鳄耳熟能详 其实威廉 欧奈尔 William J O Neil 的投资成就同
  • 自行装机配置

    2022年CPU天梯图 更新13代酷睿 锐龙7000 知乎 2022年显卡天梯图 更新4090 A770 A750 知乎 显卡 华硕显卡分级 华硕显卡系列 定位 价格 DUAL雪豹 丐版 便宜实惠 ATS巨齿鲨 中端 比DUAL系列贵 TU
  • 51 Proteus仿真频率计速度计超速报警数码管显示MAX7219-0001

    Proteus仿真小实验 51 Proteus仿真频率计速度计超速报警数码管显示MAX7219 0001 功能 硬件组成 51单片机 8位数码管 MAX7219数码管驱动模块 多个按键 LED灯 蜂鸣器 1 准确测量信号发生器输出的方波频率
  • Qt对象树

    01 什么是对象树 是用来组织和管理所有 QObject及其子类创建的对象 父对象 this 或 setParent 02 对象树的基本规则 对象树创建规则 对于Qt程序来说 父对象通常创建在栈上 子对象应创建在堆中 new 无需手动 de
  • ReentrantReadWriteLock原理分析

    在介绍ReentrantReadWriteLock读写锁原理之前 先来说下写锁与读锁 方便后续大家的理解 1 当资源被写锁占用时 此时是不允许去读的 只有当写锁被释后读锁才能去申请资源 2 当资源没有被写锁占用时 多个线程是可以共享资源 写
  • PyPI使用国内源

    PyPI使用国内源 https www cnblogs com sunnydou p 5801760 html 通过几次 的使用 对于默认的pip源的速度实在无法忍受 于是便搜集了一些国内的pip源 如下 阿里云 http mirrors
  • spring中基于AOP的基本配置

    Aop的概念 在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之 前写好的方法中的指定位置 这种编程的方式叫AOP 注意 AOP的底层用的代理 代理是一种设计模式 代理分为静态代理和动态代理 静态代理 静态代理需要自己建立
  • Angular ng-container ng-template 用法

    ng container本身不创建任何html代码 相当于一个容器
  • 对TCP/IP的深入浅出归纳【WEB开发者】腾讯认证空间

    前段时间做了一个开发 涉及到网络编程 开发过程比较顺利 但任务完成后始终觉得有一些疑惑 主要是因为对网络协议不太熟悉 对一些概念也没弄清楚 后来 我花了一些时间去了解这些网络协议 现在对TCP IP网络协议有了初步的认识 在这里总结出来 可
  • [MySQL]表的创建、修改与删除

    文章目录 1 MySQL中的数据类型 1 1 常用的数据类型 2 创建表 2 1 方式一 创建空的新表 2 1 1 新表的创建 2 1 2 查看表结构 2 1 3 查询创建表的语句 2 2 方式二 基于现有的表创建表 2 3 练习 2 3