【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空

  • 修改表
    • 添加字段
      • 语法
      • 示例
      • 注意事项
    • 删除字段
      • 语法
      • 示例
    • 修改字段
      • 使用 MODIFY COLUMN
        • 语法
        • 示例
      • 使用 CHANGE COLUMN
        • 语法
        • 示例
  • 重命名表
    • 语法
    • 示例
  • 删除表
      • 语法
      • 示例
  • 清空表
    • 使用 `TRUNCATE TABLE`
    • 使用 `DELETE FROM`
    • 对比 `TRUNCATE TABLE` 和 `DELETE FROM`
      • 操作方式
      • 性能
      • 事务处理
      • 触发器和外键约束
      • 自增主键
      • 使用建议
  • 注意事项
  • 总结

在这里插入图片描述

修改表

在MySQL中,我们经常需要对已存在的表进行修改,以满足不断变化的数据存储需求。这通常包括添加新列、删除现有列、修改列的数据类型或约束条件等操作。

添加字段

在MySQL中,为已存在的表添加字段(也称为列)是一个常见的操作,这通常是为了满足新的数据存储需求或适应业务逻辑的变化。使用ALTER TABLE语句可以方便地实现这一操作。

语法

ALTER TABLE table_name ADD COLUMN column_name datatype [constraints] [FIRST | AFTER existing_column];
  • table_name:要添加字段的表的名称。
  • column_name:新字段的名称。
  • datatype:新字段的数据类型,如INTVARCHARDATE等。
  • constraints:对新字段的约束条件,如NOT NULLDEFAULT值、UNIQUE等(可选)。
  • [FIRST | AFTER existing_column]
    • FIRST:将新字段添加到表的开头。
    • AFTER existing_column:将新字段添加到指定字段 existing_column 之后。如果省略此部分,新字段将默认添加到表的末尾。

示例

  1. 将新字段添加到表末尾(默认行为):

    ALTER TABLE employees  
    ADD COLUMN phone_number VARCHAR(20);
    
  2. 将新字段添加到表开头:

    ALTER TABLE employees  
    ADD COLUMN employee_id INT AUTO_INCREMENT FIRST,  
    ADD PRIMARY KEY (employee_id); -- 假设这是主键字段
    

    注意:在添加主键字段时,通常也会同时设置 AUTO_INCREMENT 属性和 PRIMARY KEY 约束。

  3. 将新字段添加到特定字段之后:

    ALTER TABLE employees  
    ADD COLUMN hire_date DATE AFTER last_name;
    

    在这个例子中,hire_date 字段将被添加到 last_name 字段之后。

注意事项

  1. 字段位置:在MySQL中,默认情况下新添加的字段会被放置在表的最后。如果需要将新字段添加到特定位置,可以使用AFTER column_name子句来指定位置。例如,将phone_number字段添加到email字段之后:

    ALTER TABLE employees ADD COLUMN phone_number VARCHAR(20) AFTER email;
    

    或者,如果希望将新字段添加到表的最前面,可以使用FIRST关键字:

    ALTER TABLE employees ADD COLUMN phone_number VARCHAR(20) FIRST;
    
  2. 表锁定:在执行ALTER TABLE操作时,MySQL可能会锁定表,这会导致在该表上的其他操作(如查询、更新等)被阻塞,直到ALTER TABLE操作完成。因此,在执行此类操作时应尽量选择在系统负载较低的时候进行。

  3. 备份数据:虽然ALTER TABLE操作通常是安全的,但在执行任何可能影响表结构的操作之前,始终建议备份数据以防止意外情况发生。

  4. 权限要求:执行ALTER TABLE操作需要相应的权限。通常,只有表的创建者或具有足够权限的用户才能修改表结构。

通过掌握ALTER TABLE ... ADD COLUMN语句的使用,我们可以灵活地根据需求为MySQL数据库中的表添加新的字段。

删除字段

在MySQL中,删除表中的字段(也称为列)是一个需要谨慎操作的任务,因为一旦字段被删除,与该字段相关的所有数据也将被永久移除,且无法恢复(除非你有备份)。使用ALTER TABLE语句可以方便地删除表中的字段。

语法

ALTER TABLE table_name DROP COLUMN column_name;
  • table_name:要删除字段的表的名称。
  • column_name:要删除的字段的名称。

示例

假设我们有一个名为employees的表,并且该表包含一个名为middle_name的字段,现在我们想要删除这个字段,可以使用以下SQL语句:

ALTER TABLE employees DROP COLUMN middle_name;

执行上述语句后,middle_name字段及其所有数据将从employees表中被永久删除。

修改字段

在MySQL中,修改表中的字段(也称为列)通常涉及更改字段的数据类型、名称、默认值、约束条件等。这可以通过ALTER TABLE语句结合MODIFY COLUMNCHANGE COLUMN子句来实现。

使用 MODIFY COLUMN

MODIFY COLUMN 用于更改现有字段的数据类型、约束条件等,但不能更改字段的名称。

语法
ALTER TABLE table_name MODIFY COLUMN column_name datatype [constraints];
  • table_name:要修改的表的名称。
  • column_name:要修改的字段的名称。
  • datatype:新的数据类型。
  • [constraints]:可选的字段约束条件,如 NOT NULLDEFAULT 值、UNIQUE 键等。
示例

假设我们有一个名为employees的表,并且该表包含一个名为salary的字段,现在我们想要更改该字段的数据类型为DECIMAL并设置默认值为50000.00,可以使用以下SQL语句:

ALTER TABLE employees MODIFY COLUMN salary DECIMAL(10, 2) DEFAULT 50000.00;

使用 CHANGE COLUMN

CHANGE COLUMN 既可以更改字段的数据类型、约束条件,也可以更改字段的名称。

语法
ALTER TABLE table_name CHANGE COLUMN old_column_name new_column_name datatype [constraints];
  • table_name:要修改的表的名称。
  • old_column_name:要修改的现有字段的名称。
  • new_column_name:新的字段名称(如果不需要更改名称,可以与old_column_name相同)。
  • datatype:新的数据类型。
  • [constraints]:可选的字段约束条件。
示例

假设我们有一个名为employees的表,并且该表包含一个名为emp_salary的字段,现在我们想要将字段名称更改为salary,并将其数据类型更改为DECIMAL,同时设置默认值为50000.00,可以使用以下SQL语句:

ALTER TABLE employees CHANGE COLUMN emp_salary salary DECIMAL(10, 2) DEFAULT 50000.00;

重命名表

在MySQL中,重命名表的操作相对简单,你可以使用RENAME TABLE语句来实现。这个语句允许你一次性重命名一个或多个表。

语法

RENAME TABLE old_table_name TO new_table_name;

或者,如果你需要同时重命名多个表,可以使用逗号分隔的列表(注意,在MySQL 8.0及更高版本中,一次性重命名多个表的能力被限制为在同一个数据库内的表):

RENAME TABLE old_table_name1 TO new_table_name1,old_table_name2 TO new_table_name2,...;
  • old_table_name:当前的表名称。
  • new_table_name:新的表名称。

示例

假设你有一个名为employees的表,现在你想要将这个表重命名为staff,你可以使用以下SQL语句:

RENAME TABLE employees TO staff;

如果你同时想要将另一个名为departments的表重命名为orgs,你可以这样做:

RENAME TABLE employees TO staff,departments TO orgs;

删除表

在MySQL中,删除表的操作是通过DROP TABLE语句来实现的。这个操作是永久性的,一旦执行,表及其包含的所有数据都会被删除,且无法撤销。因此,在执行此操作之前,请务必确保你已经备份了所有需要的数据,或者确认这些数据不再需要。

语法

DROP TABLE IF EXISTS table_name;
  • table_name:要删除的表的名称。

示例

假设你有一个名为old_table的表,现在你想要删除它,可以使用以下SQL语句:

DROP TABLE IF EXISTS old_table;

注意DROP TABLE操作是不可逆的,一旦执行,表及其所有数据都将被永久删除,因此在执行此操作前务必备份重要数据。

通过正确地使用DROP TABLE语句,你可以安全地删除MySQL数据库中的表。但请务必谨慎操作,并在执行前做好充分的准备和评估。如果你不确定是否应该删除某个表,或者担心删除操作可能会带来不可预知的后果,建议先咨询数据库管理员或具有相关经验的同事。

清空表

在MySQL中,如果你想要清空表中的所有数据,但保留表结构(即表的定义、索引、约束等),你可以使用TRUNCATE TABLE语句或DELETE FROM语句。这两种方法各有优缺点,适用于不同的场景。

使用 TRUNCATE TABLE

TRUNCATE TABLE 是一种快速清空表的方法,它通常比 DELETE FROM 更高效,因为它不会逐行删除数据,而是直接释放表数据所占用的空间并重置表。但是,TRUNCATE TABLE 是一个DDL(数据定义语言)操作,而不是DML(数据操作语言)操作,这意味着它会自动提交,不能回滚,并且会重置表的自增计数器。

TRUNCATE TABLE table_name;
  • table_name:要清空的表的名称。

注意事项

  • TRUNCATE TABLE 不能带有 WHERE 子句,它会删除表中的所有行。
  • 如果表中有外键约束,并且这些外键被其他表引用,则可能无法直接 TRUNCATE 该表。
  • TRUNCATE TABLE 会重置表的自增计数器(AUTO_INCREMENT)。
  • TRUNCATE TABLE 通常比 DELETE 快,因为它不生成单独的行删除操作。

使用 DELETE FROM

DELETE FROM 语句逐行删除表中的数据,并且可以在 WHERE 子句中指定条件来删除特定的行。由于 DELETE 是DML操作,它可以被事务控制,允许回滚。

DELETE FROM table_name [WHERE condition];
  • table_name:要清空的表的名称。
  • [WHERE condition]:可选的条件,用于指定要删除的行。如果不带条件,则会删除表中的所有行。

注意事项

  • DELETE FROM 可以带有 WHERE 子句来指定删除条件。
  • DELETE FROM 操作可以被事务包围,允许回滚。
  • DELETE FROM 通常比 TRUNCATE TABLE 慢,特别是当表中有大量数据时。
  • DELETE FROM 不会重置表的自增计数器,除非使用 TRUNCATE TABLE 或手动重置。

对比 TRUNCATE TABLEDELETE FROM

TRUNCATE TABLEDELETE FROM是MySQL中用于删除表中数据的两种不同方法,它们之间存在显著的差异。

操作方式

  • TRUNCATE TABLE:这是一个DDL(数据定义语言)操作,它直接删除表中的所有数据,并重置表的自增计数器(如果存在)。该操作相当于删除表并重新创建一个空表,但不会删除表结构(如列、索引、约束等)。
  • DELETE FROM:这是一个DML(数据操作语言)操作,它逐行删除表中的数据。可以通过WHERE子句指定删除条件,如果没有条件则删除所有行。此外,DELETE操作会触发相关的触发器和外键约束。

性能

  • TRUNCATE TABLE:由于TRUNCATE操作不会逐行删除数据,而是直接释放整个表的存储空间,因此通常比DELETE操作更快,特别是在处理大型表时。
  • DELETE FROMDELETE操作需要逐行删除数据,并记录每个删除操作的事务日志,以便支持回滚。因此,在处理大量数据时,DELETE操作可能会比较慢,并且会占用更多的磁盘空间来存储事务日志。

事务处理

  • TRUNCATE TABLETRUNCATE操作是一个隐式的提交操作,它会立即提交当前事务并释放锁。因此,它不能在事务中回滚。
  • DELETE FROMDELETE操作可以在事务中使用,并且支持回滚。如果在事务中执行DELETE操作后发生错误或需要取消删除,可以使用ROLLBACK命令来撤销该操作。

触发器和外键约束

  • TRUNCATE TABLETRUNCATE操作不会触发与表相关的触发器,也不会检查外键约束。因此,如果表被其他表的外键所引用,则可能无法直接TRUNCATE该表。
  • DELETE FROMDELETE操作会触发与表相关的触发器,并且会检查外键约束。如果尝试删除的行被其他表的外键所引用,则DELETE操作会失败并返回错误。

自增主键

  • TRUNCATE TABLE:执行TRUNCATE操作后,表的自增主键计数器会被重置。这意味着下一次插入数据时,自增主键将从初始值(通常是1)开始。
  • DELETE FROMDELETE操作不会重置表的自增主键计数器。即使删除了所有行,自增主键的计数器也会继续递增。

使用建议

  • 如果需要快速清空表中的所有数据,并且不关心自增主键计数器的重置、触发器的触发或外键约束的检查,可以使用TRUNCATE TABLE
  • 如果需要在事务中控制数据的删除,或者需要基于特定条件删除行,或者希望保留自增主键计数器的当前值,则应该使用DELETE FROM

综上所述,TRUNCATE TABLEDELETE FROM在MySQL中各有优缺点,选择哪种方法取决于具体的需求和场景。在使用这些命令时,请务必谨慎操作,并确保已经备份了重要的数据。

在执行任何清空表的操作之前,请务必备份数据,以防万一需要恢复。

注意事项

  1. 权限要求:执行RENAME TABLE操作需要相应的权限。通常,只有表的创建者或具有足够权限的用户才能重命名表。

  2. 表锁定:在执行RENAME TABLE操作时,MySQL会锁定涉及的表以进行结构修改。这可能会导致在该表(或这些表)上的其他操作被阻塞,直到RENAME TABLE操作完成。因此,建议在系统负载较低且对表的使用较少的时候进行此类操作。

  3. 依赖关系:检查要重命名的表是否被其他表的查询、视图、存储过程、触发器等引用,或者是否作为外键的参照表。如果有,你需要先处理这些依赖关系,否则可能会导致数据库完整性问题或查询错误。

  4. 应用程序更新:如果你的应用程序直接引用了要重命名的表,你需要确保更新应用程序中的相关代码,以使用新的表名称。

  5. 数据库引擎:虽然大多数MySQL存储引擎都支持RENAME TABLE操作,但某些特定的引擎(如Federated、Archive等)可能有特殊的限制或要求。在使用这些引擎时,请查阅相关的文档。

  6. 复制和分区:如果你的MySQL服务器配置了复制或使用了分区表,重命名表时可能需要额外的注意。例如,在复制环境中,你需要确保所有相关的从服务器都应用了相应的更改。

通过正确地使用RENAME TABLE语句,你可以安全地重命名MySQL数据库中的表。但请务必谨慎操作,并在执行前做好充分的准备和评估。

总结

通过掌握上述操作技巧,我们可以更加灵活和高效地管理MySQL数据库中的表。无论是修改表结构、重命名表、删除表还是清空表,都可以根据实际需求选择合适的操作方式。同时,务必注意在执行删除或清空操作前备份重要数据,以防止数据丢失。

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

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

相关文章

pytest框架之fixture测试夹具详解

前言 大家下午好呀,今天呢来和大家唠唠pytest中的fixtures夹具的详解,废话就不多说了咱们直接进入主题哈。 一、fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown,但相对之下它的功能更加强大和灵活。 …

宠物空气净化器该怎么选?希喂,小米、安德迈这三款好用吗?

不得不说,虽然现在购物网站的活动不少,可力度都好弱啊!我想买宠物空气净化器很久了,觉得有点贵,一直没舍得入手。价格一直没变化,平台小活动根本没什么优惠,只能寄希望于双十一了,准…

【docker】要将容器中的 livox_to_pointcloud2 文件夹复制到宿主机上

复制文件夹 使用 docker cp 命令从容器复制文件夹到宿主机&#xff1a; docker cp <container_id_or_name>:/ws_livox/src/livox_to_pointcloud2 /path/to/host/folder sudo docker cp dandong_orin_docker:/ws_livox/src/livox_to_pointcloud2 /home

WPS的JS宏实现删除某级标题下的所有内容

想要删除Word文档中&#xff0c;包含特定描述的标题下所有内容&#xff08;包含各级子标题以及正文描述&#xff09;。 例如下图中&#xff0c;想删除1.2.1.19.1业务场景下所有内容&#xff1a; 简单版&#xff1a; 删除光标停留位置的大纲级别下所有的内容。实现的JS代码如下…

【YOLO学习】YOLOv2详解

文章目录 1. 概述2. Better2.1 Batch Normalization&#xff08;批归一化&#xff09;2.2 High Resolution Classifier&#xff08;高分辨率分类器&#xff09;2.3 Convolutional With Anchor Boxes&#xff08;带有Anchor Boxes的卷积&#xff09;2.4 Dimension Clusters&…

光伏开发:一充一放和两充两放是什么意思?

一充一放 一充一放是指储能设备在一次充电过程中充满电&#xff0c;并在一次放电过程中将电能全部释放。这种模式的原理相对简单&#xff0c;充电时电能转化为化学能或其他形式的能量储存&#xff0c;放电时则将这些能量转化回电能供应给负载。一充一放模式适用于对储能设备充…

2024年9月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2024年9月国产数据库大事件和重要产品发布消息。 目录 2024年9月国产数据库大事记 TOP102024年9月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证代表厂商大事记厂商活动相关资料 2024年9月国产数据库大事记 TOP10 2024年9月国…

51单片机的无线通信智能车库门【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块红外传感器光照传感器时钟模块步进电机蓝牙按键、LED、蜂鸣器等模块构成。适用于智能车库自动门、无线控制车库门等相似项目。 可实现功能: 1、LCD1602实时显示北京时间和自动/手动模式&#xff0c;以及验证是否成…

揭秘HCIE证书:职场神话or锦上添花?深度剖析!

HCIE&#xff1a;职场赛道上的加速器 在职场这条充满挑战与机遇的赛道上&#xff0c;每个人都渴望找到那个能让自己加速前行的助推器。 HCIE证书&#xff0c;作为IT领域的顶级认证&#xff0c;无疑成为了许多人心目中的理想选择。它不仅是华为对网络专家专业能力的认可&#…

Biomamba求职| 国奖+4篇一作SCI

转眼间我也要参加秋招啦&#xff0c;认真的求职帖&#xff0c;各位老师/老板欢迎联系~其它需要求职的小伙伴也欢迎把简历发给我们&#xff0c;大家一起找工作。 一、基本信息 姓名&#xff1a;Biomamba 性别&#xff1a;男 出厂年份&#xff1a;1998 籍贯&#xff1a;浙江…

App测试时常用的adb命令

adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#xff0c;可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

如何构建某一行业的知识图谱

构建一个行业的知识图谱是一个系统而复杂的过程&#xff0c;它涉及到数据收集、处理、分析等多个环节。以下是构建行业知识图谱的基本步骤&#xff1a; 1. 需求分析&#xff1a; - 明确构建知识图谱的目的和应用场景&#xff0c;比如是用于辅助决策、市场分析、产品推荐等。…

k8s网络通信

k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel&#xff0c;calico等 CNI插件存放位置&#xff1a;# cat /etc/cni/net.d/10-flannel.conflist 插件使用的解决方案如下 虚拟网桥&#xff0c;虚拟网卡&#xff0c;多个容器共用一个虚…

模拟实现消息队列(基于SpringBoot实现)

项目代码 提要&#xff1a;此处的消息队列是仿照RabbitMQ实现&#xff08;参数之类的&#xff09;&#xff0c;实现一些基本的操作&#xff1a;创建/销毁交互机&#xff08;exchangeDeclare&#xff0c;exchangeDelete&#xff09;&#xff0c;队列&#xff08;queueDeclare&a…

<Rust>iced库(0.13.1)学习之部件(三十二):使用markdown部件来编辑md文档

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的第三十二篇,主要介绍一…

zabbix7.0配置中文界面

Zabbix 是一个广泛使用的开源监控解决方案&#xff0c;支持多种语言界面。本文将详细介绍如何配置 Zabbix 以使用中文界面&#xff0c;从而提高用户体验和可读性。 1. 环境准备 在开始配置之前&#xff0c;请确保你已经安装并运行了 Zabbix 服务器、前端和数据库。如果你还没有…

WPF|依赖属性SetCurrentValue方法不会使绑定失效, SetValue方法会使绑定失效?是真的吗?

引言 最近因为一个触发器设置的结果总是不起效果的原因&#xff0c;进一步去了解[依赖属性的优先级](Dependency property value precedence - WPF .NET | Microsoft Learn)。在学习这个的过程中发现对SetCurrentValue一直以来的谬误。 在WPF中依赖属性Dependency property的…

从0到1:小区业主决策投票小程序开发笔记

可研 小区业主决策投票小程序&#xff1a; 便于业主参与社区事务的决策&#xff0c;通过网络投票的形式&#xff0c;大大节省了业委会和业主时间&#xff0c;也提高了投票率。其主要功能&#xff1a;通过身份证、业主证或其他方式确认用户身份&#xff1b;小区管理人员或业委会…

Java 17流程控制语句3w字解读

本笔记来自尚硅谷教育-康师傅&#xff0c;学习教程&#xff1a;https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from333.337.search-card.all.click 本章专题与脉络 第1阶段&#xff1a;Java基本语法-第03章 流程控制语句是用来控制程序中各语句执行顺序的语句&#xf…

5个免费ppt模板网站推荐!轻松搞定职场ppt制作!

每次过完小长假&#xff0c;可以明显地感觉到&#xff0c;2024这一年很快又要结束了&#xff0c;不知此刻的你有何感想呢&#xff1f;是满载而归&#xff0c;还是准备着手制作年终总结ppt或年度汇报ppt呢&#xff1f; 每当说到制作ppt&#xff0c;很多人的第一反应&#xff0c…