<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>HiJiangChuan (蒋川)</title>
    <link>https://ruby-china.org/HiJiangChuan</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>如何使用 Workbench 远程连接到 MySQL 数据库 -MySQL Workbench 使用教程</title>
      <description>&lt;p&gt;&lt;img src="https://kalacloud.com/static/0f04401a00607bc8a11bdf2c11b7f388/ef245/head.jpg" title="" alt="MySQL Workbench 使用教程：如何使用 Workbench 远程连接到 MySQL 服务器"&gt;&lt;/p&gt;

&lt;p&gt;MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具，我们可以在自己的计算机上，使用图形化界面（GUI）远程管理 MySQL 数据库。&lt;/p&gt;

&lt;p&gt;有关 MySQL 远程管理软件，你可以选择 Windows 下的&amp;nbsp;&lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/" rel="nofollow" target="_blank" title=""&gt;HeidiSQL&lt;/a&gt;，MacOS 下的&amp;nbsp;&lt;a href="https://zhihu.com/question/21792734/answer/2236258250" rel="nofollow" target="_blank" title=""&gt;Sequel Ace&lt;/a&gt;&amp;nbsp;或者 MySQL 官方推出的跨平台客户端&amp;nbsp;&lt;a href="http://www.mysql.com/products/workbench/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench&lt;/a&gt;&amp;nbsp;。如果你需要针对自己的工作流对数据库操作，定制开发，推荐一下卡拉云，详情见文末。&lt;/p&gt;

&lt;p&gt;本教程将详细讲解如何使用 MySQL Workbench 配置连接到你的远程数据库。&lt;/p&gt;
&lt;h2 id="一. 先决条件"&gt;一。先决条件&lt;/h2&gt;
&lt;p&gt;要跟随本教程学习，你需要准备：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  一台开启 SSH 登录的 Ubuntu 服务器&lt;/li&gt;
&lt;li&gt;  服务器开启远程登录 MySQL（&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 阿里云连接教程&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;  安装好 MySQL Workbench（未安装可看：&lt;a href="https://kalacloud.com/blog/mysql-workbench-tutorial/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench 使用教程&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二. 配置 workbench 的第一个连接"&gt;二。配置 workbench 的第一个连接&lt;/h2&gt;
&lt;p&gt;在你的计算机上安装 MySQL Workbench 后启动，点击 MySQL Connections 旁边的 + 图标创建一个新连接。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/39d84d8c66000f50d28ae645d9f9a9a1/e5166/01-workbench-add.jpg" title="" alt="01-workbench-add.jpg"&gt;&lt;/p&gt;

&lt;p&gt;点击 + 号，创建新连接。&lt;/p&gt;

&lt;p&gt;弹出「连接到数据库」的窗口：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/d9fcb88d33a18195edf9e16216b9a4ae/e5166/02-workbench.jpg" title="" alt="02-workbench.jpg"&gt;&lt;/p&gt;

&lt;p&gt;要创建连接，请输入以下详细信息：&lt;/p&gt;

&lt;p&gt;1.Connection Name：此连接配置项的名字，&lt;code&gt;MySQL_for_kalacloud.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2.Connection Method：连接方式改为&lt;code&gt;Standard TCP/IP over SSH&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3.SSH Hostname：使用 SSH 远程服务器的 IP 地址（本教程使用虚拟机，故是一个内网 IP）&lt;/p&gt;

&lt;p&gt;4.SSH Username：使用 SSH 登录服务器的用户名&lt;/p&gt;

&lt;p&gt;5.SSH Password：使用 SSH 登录服务器的密码&lt;/p&gt;

&lt;p&gt;6.MySQL Hostname：这里要特别注意，Workbench 的工作原理是先通过 SSH 登录服务器，再本地登录 MySQL 数据库，故此 Hostname 是本地 IP 地址，即&amp;nbsp;&lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;7.MySQL Server Port：MySQL 默认远程登录端口为&amp;nbsp;&lt;code&gt;3306&lt;/code&gt;&amp;nbsp;可根据实际情况修改。&lt;/p&gt;

&lt;p&gt;8.Username：远程登录 MySQL 数据库的用户名（是 MySQL 里设置的用户名，和服务器配置没有关系）&lt;/p&gt;

&lt;p&gt;9.Password：上面登录 MySQL 数据库用户名对应的密码&lt;/p&gt;

&lt;p&gt;有关远程登录 MySQL 的教程可看《&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 数据库，阿里云腾讯云外网连接教程&lt;/a&gt;》&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/f997ec23b285cfbb23cac781aac83869/e5166/03-workbench-test.jpg" title="" alt="03-workbench-test.jpg"&gt;&lt;/p&gt;

&lt;p&gt;10.Test Connection：点击此按钮可测试以上配置是否正确，如不正确可根据返回错误信息进行调整。&lt;/p&gt;

&lt;p&gt;11.最后点击右下角 OK 保存配置信息。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/e97c6ac7a0df74957ddd4f005aa15437/e5166/04-workbench-setup.jpg" title="" alt="04-workbench-setup.jpg"&gt;&lt;/p&gt;

&lt;p&gt;点击已经保存好的连接配置&lt;code&gt;MySQL_for_kalacloud.com&lt;/code&gt;&amp;nbsp;登录远程 MySQL 服务器&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 阿里云允许远程连接教程&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="三. 使用 MySQL Workbench 管理数据库"&gt;三。使用 MySQL Workbench 管理数据库&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/db4514524ecdb0176b89daa7b20bd838/e5166/05-ssh-mysql.jpg" title="" alt="ssh-mysql"&gt;&lt;/p&gt;

&lt;p&gt;连接数据库后，你可以查看 MySQL 实例信息，数据库状态、当前连接数、数据库配置以及用户和权限。&lt;/p&gt;

&lt;p&gt;MySQL Workbench 还支持导入和导出 MySQL 文件，你可以使用 workbench 对数据库进行备份和恢复。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/064b94a5ea7ce7e17ee91f88d7c56a7d/e5166/06-schemas.jpg" title="" alt="06-schemas.jpg"&gt;&lt;/p&gt;

&lt;p&gt;你可以在左侧导航栏「SCHEMAS」的标签下看到数据库具体情况。点击下拉箭头可以查看数据库的表和对象。所以你可以通过 MySQL Workbench 管理你的数据库，写复杂的 SQL 查询，直接编辑数据。&lt;/p&gt;

&lt;p&gt;扩展阅读：《如何使用&amp;nbsp;&lt;a href="https://kalacloud.com/blog/how-to-create-er-diagram-of-a-database-in-mysql-workbench/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench 自动生成 ER 图&lt;/a&gt;，自动同步更新远程数据库》&lt;/p&gt;
&lt;h2 id="四. 总结"&gt;四。总结&lt;/h2&gt;
&lt;p&gt;现在我们使用 MySQL Workbench 通过 SSH 访问远程服务器后，再登录 MySQL 数据库。可以在本地轻松管理远程数据库，但 Workbench 只能做较底层的数据库操作。对于「构建在数据库之上，做前端定制开发」的需求，并不适用。&lt;/p&gt;

&lt;p&gt;这里推荐一下卡拉云，卡拉云是新一代低代码开发工具，免安装部署，可一键接入包括 MySQL 在内的常见数据库及 API。不仅可以完成 Workbench 所有功能，还可根据自己的工作流，定制开发。无需繁琐的前端开发，只需要简单拖拽，即可快速搭建企业内部工具。&lt;strong&gt;数月的开发工作量，使用卡拉云后可缩减至数天。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/18822b2a23183deb7d11dd484a7f65aa/c1b63/07-sql.png" title="" alt="07-sql.png"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可一键接入常见的数据库及 API&lt;/p&gt;

&lt;p&gt;下图为使用卡拉云在 5 分钟内搭建的「&lt;a href="https://kalacloud.com/blog/coupon-system-design/" rel="nofollow" target="_blank" title=""&gt;优惠券发放核销&lt;/a&gt;」后台，仅需要简单拖拽即可快速生成前端组件，只要会写 SQL，便可搭建一套趁手的数据库工具。&lt;strong&gt;欢迎&lt;a href="https://kalacloud.com/" rel="nofollow" target="_blank" title=""&gt;试用卡拉云&lt;/a&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/34625d3adaea4ed250ff3f05b863e47c/c1b63/08-kalacloud-sql.png" title="" alt="kalacloud-sql"&gt;&lt;/p&gt;

&lt;p&gt;有关 MySQL 教程，可继续拓展学习：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/difference-between-mysql-datetime-and-timestamp-datatypes/" rel="nofollow" target="_blank" title=""&gt;MySQL 时间戳用什么类型 - MySQL 时间函数详解&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-use-the-mysql-blob-data-type-to-store-images-with-php-or-kalacloud/" rel="nofollow" target="_blank" title=""&gt;MySQL 中如何实现 BLOB 数据类型的存取，BLOB 有哪些应用场景？&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-dump-database-and-ignore-or-specific-some-tables-with-mysqldump-in-mysql/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL / MariaDB 中跳过多张表导出或指定多张表导出备份&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-save-mysql-mariadb-query-output-to-a-file/" rel="nofollow" target="_blank" title=""&gt;如何将 MySQL / MariaDB 的查询结果保存到文件&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers/" rel="nofollow" target="_blank" title=""&gt;MySQL 触发器使用教程 - 创建、删除、查看&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Fri, 26 Nov 2021 23:00:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/41932</link>
      <guid>https://ruby-china.org/topics/41932</guid>
    </item>
    <item>
      <title>MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南</title>
      <description>&lt;p&gt;&lt;img src="https://kalacloud.com/static/2bdadee47f747aa8b35007e256a0b778/ef245/head.jpg" title="" alt="MySQL Workbench 使用教程 - 如何使用 MySQL Workbench 操作数据库"&gt;&lt;/p&gt;

&lt;p&gt;MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件，我们可以在自己的计算机上，使用图形化界面远程管理 MySQL 数据库。&lt;/p&gt;

&lt;p&gt;有关 MySQL 远程管理软件，你可以选择 Windows 下的&amp;nbsp;&lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/" rel="nofollow" target="_blank" title=""&gt;HeidiSQL&lt;/a&gt;，MacOS 下的&amp;nbsp;&lt;a href="https://zhihu.com/question/21792734/answer/2236258250" rel="nofollow" target="_blank" title=""&gt;Sequel Ace&lt;/a&gt;&amp;nbsp;或者 MySQL 官方推出的跨平台客户端&amp;nbsp;&lt;a href="http://www.mysql.com/products/workbench/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench&lt;/a&gt;&amp;nbsp;。&lt;/p&gt;

&lt;p&gt;本文使用 Mac 版 MySQL Workbench 进行讲解，Mac 版与 windows 版、Linux 版除 UI 界面稍有不同外，整个操作逻辑完全一致，不论你使用何种操作系统及版本，均可跟随本教程学习。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;本教程目录&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;一。如何下载及安装 MySQL Workbench&lt;/p&gt;

&lt;p&gt;二。如何使用 Workbench 远程连接数据库&lt;/p&gt;

&lt;p&gt;三。使用 Workbench 操作数据库&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; MySQL Workbench 初始化界面&lt;/li&gt;
&lt;li&gt; 连接远程 MySQL 数据库&lt;/li&gt;
&lt;li&gt; 创建数据库&lt;/li&gt;
&lt;li&gt; 在数据库中创建表&lt;/li&gt;
&lt;li&gt; 查看表数据&lt;/li&gt;
&lt;li&gt; 向 table 表中插入数据&lt;/li&gt;
&lt;li&gt; 修改字段属性&lt;/li&gt;
&lt;li&gt; 删除数据库中的表&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;四。MySQL 数据导入导出&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 导入 SQL 数据&lt;/li&gt;
&lt;li&gt; 导出 SQL 数据&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;五。配置 MySQL 数据库表属性&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 主键约束&lt;/li&gt;
&lt;li&gt; 外键约束&lt;/li&gt;
&lt;li&gt; 唯一约束：UQ 索引&lt;/li&gt;
&lt;li&gt; 非空约束&lt;/li&gt;
&lt;li&gt; 默认值约束&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;六。在 Workbench 中执行一条 SQL 查询&lt;/p&gt;

&lt;p&gt;七。创建触发器及触发器的应用&lt;/p&gt;

&lt;p&gt;八。用户账号和访问权限&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 查看 MySQL 数据库中的账号情况&lt;/li&gt;
&lt;li&gt; 创建 MySQL 数据库账号&lt;/li&gt;
&lt;li&gt; 删除 MySQL 数据库账号&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;九。Workbench 的升级版卡拉云&lt;/p&gt;
&lt;h2 id="一. 如何下载及安装 MySQL Workbench"&gt;一。如何下载及安装 MySQL Workbench&lt;/h2&gt;
&lt;p&gt;MySQL Workbench 作为 MySQL 官方出品的数据库操作软件，我们可以前往&amp;nbsp;&lt;a href="https://downloads.mysql.com/archives/workbench/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench 官方下载页&lt;/a&gt;&amp;nbsp;免费下载。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/8e1098d20024f99b1025a27357fd27a4/dcec8/0-downloads.jpg" title="" alt="下载MySQL Workbench"&gt;&lt;/p&gt;

&lt;p&gt;在这个下载页中，可根据你的实际情况选择适合你的运行平台及版本。&lt;/p&gt;

&lt;p&gt;下载后一路 Next 安装即可。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;10 款 MySQL GUI 管理工具横向测评 - 免费和付费到底怎么选？&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="二. 如何使用 Workbench 远程连接数据库"&gt;二。如何使用 Workbench 远程连接数据库&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;  你的服务器需要打开 SSH 登录（如果选择 SSH 登录后再登录 MySQL 需要打开）&lt;/li&gt;
&lt;li&gt;  调整服务器防火墙&lt;/li&gt;
&lt;li&gt;  配置好 MySQL 远程登录（如果选择直接远程登录 MySQL 服务器时需要打开）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;有关 Workbench 远程登录的教程，请在《&lt;a href="https://kalacloud.com/blog/how-to-connect-to-a-mysql-server-remotely-with-mysql-workbench//?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;如何使用 Workbench 远程连接到 MySQL 服务器&lt;/a&gt;》查看全文。&lt;/p&gt;

&lt;p&gt;有关 MySQL 开启远程登录的教程，请在《&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 数据库，配置阿里云外网连接&lt;/a&gt;》查看全文。&lt;/p&gt;
&lt;h2 id="三. 使用 Workbench 操作数据库"&gt;三。使用 Workbench 操作数据库&lt;/h2&gt;&lt;h3 id="1.MySQL Workbench 初始化界面"&gt;1.MySQL Workbench 初始化界面&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/86f583895bedf3a19a03dc88d6f4e3e0/48958/01-interface.jpg" title="" alt="Workbench 初始化界面"&gt;&lt;/p&gt;

&lt;p&gt;Workbench 初始化界面&lt;/p&gt;
&lt;h3 id="2.连接远程 MySQL 数据库"&gt;2.连接远程 MySQL 数据库&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/fc5a2ec9afda037d9f8b503f6d1512e6/cd367/02-connect.jpg" title="" alt="连接远程 MySQL 数据库"&gt;&lt;/p&gt;

&lt;p&gt;点击配置好的远程登录卡片，登录远程 MySQL 服务器。如果你还没配置好远程端，请参照《&lt;a href="https://kalacloud.com/blog/how-to-connect-to-a-mysql-server-remotely-with-mysql-workbench//?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;如何使用 Workbench 远程连接到 MySQL 服务器&lt;/a&gt;》这篇教程进行配置。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/a3eec04dc6a8e68f3ff32ffe4b05eb7d/06921/03-connect-face.jpg" title="" alt="连接远程 MySQL 数据库"&gt;&lt;/p&gt;

&lt;p&gt;登录远程数据库后，红框部分为当前远程 MySQL 数据库中已经创建好的数据库列表。&lt;/p&gt;
&lt;h3 id="3.创建数据库"&gt;3.创建数据库&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/922f02c387539f147c530355b0fc8b1a/93992/04-create-databases.jpg" title="" alt="创建数据库"&gt;&lt;/p&gt;

&lt;p&gt;在&amp;nbsp;&lt;code&gt;SCHEMAS&lt;/code&gt;&amp;nbsp;列表的空白处，点击鼠标右键，在弹出的菜单中选择「Create Schema…」，进入数据库创建流程页面。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/ed57545a0d8156f65fdb3a31da5b78de/93992/05-database-rename.jpg" title="" alt="填写数据库名称"&gt;&lt;/p&gt;

&lt;p&gt;在 Schema Name 里填入新建数据库的数据库名，然后选择 Apply&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/7649d46b436e50628cf97c9beb0a426c/6753f/06-database-rename-sql.jpg" title="" alt="生成 SQL 命令脚本"&gt;&lt;/p&gt;

&lt;p&gt;MySQL Workbench 会自动帮助我们生成 SQL 命令，创建数据库。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/1db6aee51657de14589554fbf53a0252/3b2a1/07-create-databases-successfully.jpg" title="" alt="创建数据库成功"&gt;&lt;/p&gt;

&lt;p&gt;执行命令，创建成功。可以看到 Schemas 列表中多了我们刚刚创建的&amp;nbsp;&lt;code&gt;kalacloud_demo&lt;/code&gt;&amp;nbsp;数据库&lt;/p&gt;
&lt;h3 id="4.在kalacloud_demo&amp;nbsp;数据库中创建表"&gt;4.在&lt;code&gt;kalacloud_demo&lt;/code&gt;&amp;nbsp;数据库中创建表&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/0d3711a82eeab907c682ced7a27dcebf/dfb5e/08-set-as-default.jpg" title="" alt="设置当前数据库为默认数据库"&gt;&lt;/p&gt;

&lt;p&gt;右键点击&lt;code&gt;kalacloud_demo&lt;/code&gt;&amp;nbsp;，选择&amp;nbsp;&lt;code&gt;Set as Default Schema&lt;/code&gt;&amp;nbsp;先把它设置成默认数据库。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/423b89c2ffc612cc032d18e12acf1a1b/0d6e3/09-create-tables.jpg" title="" alt="创建数据库中的表"&gt;&lt;/p&gt;

&lt;p&gt;然后选择下箭头，右键点击&amp;nbsp;&lt;code&gt;Tables&lt;/code&gt;&amp;nbsp;选择&amp;nbsp;&lt;code&gt;Create Table&lt;/code&gt;&amp;nbsp;进入创建表的流程页。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/b7f6805b49bab932e875b905061cb352/14fc6/10-create-tables-id.jpg" title="" alt="表的创建流程页"&gt;&lt;/p&gt;

&lt;p&gt;（1）&lt;code&gt;Name&lt;/code&gt;：这里填写表名&lt;/p&gt;

&lt;p&gt;（2）这里创建表中的各列、列属性。&lt;/p&gt;

&lt;p&gt;（3）点击＜click to edit＞可添加一列。&lt;/p&gt;

&lt;p&gt;（4）点击 Apply 执行 SQL 命令。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/20f2be854efb6e308a0edaaa1469c35d/48958/11-create-tables-id-sql.jpg" title="" alt="创建表的 SQL 命令"&gt;&lt;/p&gt;

&lt;p&gt;MySQL Workbench 会帮我们生成创建表的 SQL 命令。&lt;/p&gt;
&lt;h3 id="5.查看表数据"&gt;5.查看表数据&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/c622d0d5b8f466b5af87a0840d6f360a/bbc43/12-select-tables.jpg" title="" alt="查看表数据"&gt;&lt;/p&gt;

&lt;p&gt;（1）点击要查看的表名后面的「闪电 icon」标示&lt;/p&gt;

&lt;p&gt;（2）Workben 自动帮我们生成一段查看表的 SQL 命令&lt;/p&gt;

&lt;p&gt;（3）点击黄色闪电标志执行后，可在 Result Grid 看到查询表的表数据&lt;/p&gt;
&lt;h3 id="6.向 table 表中插入数据"&gt;6.向 table 表中插入数据&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/b92d4c662a5d4d5fdbd0c55be3dff17b/bbc43/13-1-insert-tables.jpg" title="" alt="向 table 表中插入数据"&gt;&lt;/p&gt;

&lt;p&gt;（1）使用&amp;nbsp;&lt;code&gt;Select&lt;/code&gt;&amp;nbsp;查出表内容后，在表格内直添加需要写入的数据。&lt;/p&gt;

&lt;p&gt;（2）Workbench 会生成一段查看表的代码&lt;/p&gt;

&lt;p&gt;（3）在下方表格中展示表内数据，我们可以根据自己的需求在这里向表内添加数据。&lt;/p&gt;

&lt;p&gt;（4）最后点击应用生成添加数据的代码&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/78d4850a53eeb606cc052d18157b1a72/8b3ab/13-2-insert-tables-sql.jpg" title="" alt="向 table 表中插入数据的 SQL 代码"&gt;&lt;/p&gt;

&lt;p&gt;如上图所示，我们可以看到 id 为 1 的卡拉云这一行数据已经转化成 SQL 命令，点击应用即可将数据添加到数据库中。&lt;/p&gt;
&lt;h3 id="7.修改字段属性"&gt;7.修改字段属性&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/44788d68f8faa783bc9dd4287717e958/ad3f1/14-alter-tables.jpg" title="" alt="修改字段属性"&gt;&lt;/p&gt;

&lt;p&gt;右键点击需要修改的表，选择「Alter Table...」，右侧会显示出表信息，修改需要修改的内容后，Apply 即可应用。&lt;/p&gt;
&lt;h3 id="8.删除数据库中的表"&gt;8.删除数据库中的表&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/98f91cd08635c62bb71c4fcc4a207e37/ad3f1/15-del-tables.jpg" title="" alt="删除数据表"&gt;&lt;/p&gt;

&lt;p&gt;右键选择需要删除的表，然后点击「Drop Table...」即可删除。注意：此操作不可撤回，谨慎选择。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/mysql-remove-duplicate-records/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL 中查找和删除重复记录？&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="四. MySQL 数据导入导出"&gt;四。MySQL 数据导入导出&lt;/h2&gt;&lt;h3 id="1.使用 MySQL Workbench 导入 SQL 数据"&gt;1.使用 MySQL Workbench 导入 SQL 数据&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/85cc88ef4f3dc684a0c0c3c21d65c4f8/cd851/16-open-sql-script.jpg" title="" alt="使用 MySQL Workbench 导入数据"&gt;&lt;/p&gt;

&lt;p&gt;在菜单栏中选择&amp;nbsp;&lt;code&gt;File&lt;/code&gt;&amp;nbsp;→&amp;nbsp;&lt;code&gt;Open SQL Script...&lt;/code&gt;&amp;nbsp;选择要导入的 SQL 文件&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/68149eb07a89a2deb2ab8b42f50d12a6/903c8/17-open-sql.jpg" title="" alt="打开 SQL 文件"&gt;&lt;/p&gt;

&lt;p&gt;在弹出的对话框中选择需要导入的 SQL 文件。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/3390b9fa2564f0bb544f52e620249bbc/d9e34/18-0-use-database.jpg" title="" alt="选择 SQL 文件"&gt;&lt;/p&gt;

&lt;p&gt;这里非常关键，一定要仔细阅读。&lt;/p&gt;

&lt;p&gt;（1）在打开的 SQL 文件的头部，写入需要导入的数据库名，本教程将导入&amp;nbsp;&lt;code&gt;kalacloud_demo&lt;/code&gt;&amp;nbsp;这个数据库。所以在文件中写入&amp;nbsp;&lt;code&gt;USE kalacloud_demo;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;（2）点击黄色闪电 icon 执行代码&lt;/p&gt;

&lt;p&gt;（3）将这 4 条数据写入数据库对应的 users 表中&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/79c5307d9fd1bec7c1d59e8dd75b4512/25fc1/18-1-use-database-sess.jpg" title="" alt="MySQL 数据导入成功"&gt;&lt;/p&gt;

&lt;p&gt;使用&amp;nbsp;&lt;code&gt;SELECT&lt;/code&gt;&amp;nbsp;查询表，可以看到 4 条数据已经成功导入&lt;/p&gt;
&lt;h3 id="2.使用 MySQL Workbench 导出 SQL 数据"&gt;2.使用 MySQL Workbench 导出 SQL 数据&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/9f1bb55a9f813121873f33ee10d084ba/d9e34/19-Data-Export.jpg" title="" alt="使用 MySQL Workbench 导出数据"&gt;&lt;/p&gt;

&lt;p&gt;（1）选择 Administration 标签&lt;/p&gt;

&lt;p&gt;（2）在 MANAGENMENT 中找到 Data Export&lt;/p&gt;

&lt;p&gt;（3）选择需要导出的数据库&lt;/p&gt;

&lt;p&gt;（4）选择需要导出数据库中的表&lt;/p&gt;

&lt;p&gt;（5）选择导出内容&lt;/p&gt;

&lt;p&gt;（6）选择导出 SQL 文件的存储路径&lt;/p&gt;

&lt;p&gt;（7）Start Export 开始导出&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-import-and-export-databases-excel-csv-in-mysql-or-mariadb-from-terminal/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL 中导入导出 SQL 数据、Excel、CSV&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="五. 配置 MySQL 数据库表属性"&gt;五。配置 MySQL 数据库表属性&lt;/h2&gt;&lt;h3 id="1.主键约束"&gt;1.主键约束&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/5157908784800877046bfa8f73225027/bbc43/20-Primary-Key.jpg" title="" alt="主键约束 Primary-Key"&gt;&lt;/p&gt;

&lt;p&gt;Primary Key（PK）：主键约束，指定某列的数据非空、唯一、不能重复&lt;/p&gt;

&lt;p&gt;（1）右键点击需要设置的表，选择「Alter Table...」&lt;/p&gt;

&lt;p&gt;（2）&lt;code&gt;PK&lt;/code&gt;&amp;nbsp;为设置主键约束。&lt;/p&gt;
&lt;h3 id="2.外键约束"&gt;2.外键约束&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/d5b0279b5173590f79590829dca074d1/50a3f/21-Foreign-Key.jpg" title="" alt="外键约束-Foreign-Key"&gt;&lt;/p&gt;

&lt;p&gt;Foreign Key：外键，指定该列记录属于主表中的一条记录，参照另一条数据&lt;/p&gt;

&lt;p&gt;（1）右键点击需要设置的表，选择「Alter Table...」&lt;/p&gt;

&lt;p&gt;（2）选择「Foreign Keys」的标签&lt;/p&gt;

&lt;p&gt;（3）选择要关联的表&lt;/p&gt;

&lt;p&gt;（4）当前表的列，选择要关联的键&lt;/p&gt;

&lt;p&gt;（5）被关联表的列，选择需要关联的键&lt;/p&gt;

&lt;p&gt;（6）Apply 应用，进行关联&lt;/p&gt;
&lt;h3 id="3.唯一约束：UQ 索引"&gt;3.唯一约束：UQ 索引&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/140312065d254937dc5a0c6cffbefdfc/a4151/22-Unique.jpg" title="" alt="唯一约束：UQ 索引"&gt;&lt;/p&gt;

&lt;p&gt;Unique：唯一约束，指定某列和几列组合的数据不能重复&lt;/p&gt;

&lt;p&gt;选中的列就是数据表的唯一约束索引，取消选中则取消该列的唯一约束索引。&lt;/p&gt;
&lt;h3 id="4.非空约束"&gt;4.非空约束&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/e127a0002213f61403d93a5e54d07d43/3d027/23-Not-Null.jpg" title="" alt="非空约束-Not-Null.jpg"&gt;&lt;/p&gt;

&lt;p&gt;Not Null：非空约束，指定某列不能为 NULL 空&lt;/p&gt;

&lt;p&gt;选中 NN 的列为数据表的非空约束，取消选中则取消该列的非空约束。&lt;/p&gt;
&lt;h3 id="5.默认值约束"&gt;5.默认值约束&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/2f04157cce02cf86f96f80f45e92a2f8/d9e34/24-Default.jpg" title="" alt="默认值约束-Default"&gt;&lt;/p&gt;

&lt;p&gt;默认值（Default）的完整名称是 默认值约束（Default Constraint）&lt;/p&gt;

&lt;p&gt;MySQL&amp;nbsp;默认值约束用来指定某列的默认值。&lt;/p&gt;

&lt;p&gt;红框部分，&lt;code&gt;states&lt;/code&gt;&amp;nbsp;的默认值设定为「1」，即插入一条新的记录时没有为这个字段赋值，那么系统会自动为这个字段赋值为「1」。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-reset-auto-increment-in-mysql/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;MySQL 重置自增 ID (AUTO_INCREMENT) 教程 - 完美保留表数据的终极解决方案&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="六. 在 Workbench 中执行一条 SQL 查询"&gt;六。在 Workbench 中执行一条 SQL 查询&lt;/h2&gt;
&lt;p&gt;我们也可以直接在 Workbench 执行一段 SQL 查询，下面这段代码是向&lt;code&gt;kalacloud_demo&lt;/code&gt;数据库中&lt;code&gt;kalacloud_table_demo&lt;/code&gt;表里插入一行数据。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO `kalacloud_demo`.`kalacloud_table_demo` (`id`, `name`, `phone`, `wechat_id`, `wechat_name`, `states`) 
VALUES ('2', '卡拉云 kalacloud', '13777779999', 'kalacloud', '卡拉云 kalacloud.com', '2');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/8cb35a0e61d7534bf344618685aeda46/d9e34/25-query-run.jpg" title="" alt="执行 query"&gt;&lt;/p&gt;

&lt;p&gt;直接在&amp;nbsp;&lt;code&gt;Query&lt;/code&gt;&amp;nbsp;标签中写入 SQL 代码，然后点击「黄色闪电」即可执行代码。&lt;/p&gt;

&lt;p&gt;然后，我们运行&amp;nbsp;&lt;code&gt;select&lt;/code&gt;&amp;nbsp;查看上一条命令是否已经写入表中。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM kalacloud_demo.kalacloud_table_demo;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/ce0303a62eca314ddb44deda73b10982/d9e34/26-query-check.jpg" title="" alt="query 执行完成"&gt;&lt;/p&gt;

&lt;p&gt;我们可以看到，红框部分，ID 2 这一条就是刚刚我们写入的数据。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-get-the-sizes-of-the-tables-of-a-mysql-database/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;如何查看 MySQL 数据库、表、索引容量大小？找到占用空间最大的表&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="七. 创建 MySQL 触发器及触发器的应用"&gt;七。创建 MySQL 触发器及触发器的应用&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/3c8779a359c9c8ac838bf21942a6b405/ad3f1/27-Triggers.jpg" title="" alt="创建 MySQL 触发器"&gt;&lt;/p&gt;

&lt;p&gt;1.鼠标右键点击需要添加触发器的表。&lt;/p&gt;

&lt;p&gt;2.选择&amp;nbsp;&lt;code&gt;Triggers&lt;/code&gt;&amp;nbsp;标签，进入触发器设置页面&lt;/p&gt;

&lt;p&gt;3.选择需要添加的触发器类型。&lt;/p&gt;

&lt;p&gt;4.添加触发器代码&lt;/p&gt;

&lt;p&gt;MySQL 触发器一共有 6 种类型：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;BEFORE INSERT&lt;/code&gt;&amp;nbsp;：在插入数据前，检测插入数据是否符合业务逻辑，如不符合返回错误信息。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;AFTER INSERT&lt;/code&gt;&amp;nbsp;：在表 A 创建新账户后，将创建成功信息自动写入表 B 中。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;BEFORE UPDATE&lt;/code&gt;&amp;nbsp;：在更新数据前，检测更新数据是否符合业务逻辑，如不符合返回错误信息。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;AFTER UPDATE&lt;/code&gt;&amp;nbsp;：在更新数据后，将操作行为记录在 log 中&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;BEFORE DELETE&lt;/code&gt;&amp;nbsp;：在删除数据前，检查是否有关联数据，如有，停止删除操作。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;AFTER DELETE&lt;/code&gt;&amp;nbsp;：删除表 A 信息后，自动删除表 B 中与表 A 相关联的信息。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;有关六类触发器的实际使用方法及应用场景的详细教程，可查看《&lt;a href="https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;MySQL 触发器 创建、查看、删除 insert、update、delete 教程 - 卡拉云&lt;/a&gt;》文章。此教程以实际应用场景为线索，按照场景细致讲解了全部 6 种触发器的使用方法。&lt;/p&gt;
&lt;h2 id="八. 用户账号和访问权限"&gt;八。用户账号和访问权限&lt;/h2&gt;&lt;h3 id="1.查看 MySQL 数据库中的账号情况"&gt;1.查看 MySQL 数据库中的账号情况&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/c58a36b70fdb004dbd9a8d0ba21ddf08/ad3f1/28-0-enter-users.jpg" title="" alt="查看 MySQL 数据库中的账号情况"&gt;&lt;/p&gt;

&lt;p&gt;（1）在菜单栏选择&amp;nbsp;&lt;code&gt;Server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;（2）选择&amp;nbsp;&lt;code&gt;Users and Privileges&lt;/code&gt;&amp;nbsp;进入用户管理页面&lt;/p&gt;
&lt;h3 id="2.创建 MySQL 数据库账号"&gt;2.创建 MySQL 数据库账号&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/e4f3b625ed2d03fac3740a6e32b1c6c7/1176d/28-1-Add-Account.jpg" title="" alt="创建 MySQL 数据库账号"&gt;&lt;/p&gt;

&lt;p&gt;（1）选择&amp;nbsp;&lt;code&gt;Add Account&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;（2）添加账号详细信息&lt;/p&gt;

&lt;p&gt;（3）Apply 应用&lt;/p&gt;
&lt;h3 id="3.删除 MySQL 数据库账号"&gt;3.删除 MySQL 数据库账号&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/7ac5ff0fc8c68cc41ef98a701658d6f6/d9e34/28-2-dele.jpg" title="" alt="删除 MySQL 数据库账号"&gt;&lt;/p&gt;

&lt;p&gt;（1）选择需要删除的账号&lt;/p&gt;

&lt;p&gt;（2）点击&amp;nbsp;&lt;code&gt;Delete&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;（3）点击&amp;nbsp;&lt;code&gt;Refresh&lt;/code&gt;&amp;nbsp;刷新列表&lt;/p&gt;

&lt;p&gt;最后，Workbench 有一些只有付费软件才独有的功能，比如画 ER 图，比如正逆向工程，数据库本地远程之间同步等，这类进阶功能我单独写了一篇，大家可以看这篇《&lt;a href="https://kalacloud.com/blog/how-to-create-er-diagram-of-a-database-in-mysql-workbench/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;如何使用 MySQL Workbench 自动生成 ER 图、同步更新远程数据库 - MySQL Workbench 使用教程&lt;/a&gt;》&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-create-a-new-user-and-grant-permissions-in-mysql/?utm_medium=inside" rel="nofollow" target="_blank" title=""&gt;MySQL 权限管理查询手册 - 创建、授权、取消授权、删除、重命名账号&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="九. 卡拉云 - 新一代低代码开发工具"&gt;九。卡拉云 - 新一代低代码开发工具&lt;/h2&gt;
&lt;p&gt;MySQL Workbench 为我们提供了管理 MySQL 的图形界面管理工具，可以在本地轻松管理远程数据库，但 Workbench 只能做较底层的数据库操作。对于「构建在数据库之上，需要前端定制开发」的需求，并不适用。&lt;/p&gt;

&lt;p&gt;这里推荐一下卡拉云，卡拉云是新一代低代码开发工具，免安装部署，可一键接入包括 MySQL 在内的常见数据库及 API。不仅可以完成 Workbench 所有功能，还可根据自己的工作流，定制开发。无需繁琐的前端开发，只需要简单拖拽，即可快速搭建企业内部工具。数月的开发工作量，使用卡拉云后可缩减至数天。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/18822b2a23183deb7d11dd484a7f65aa/71c1d/97-kalacloud-sql.png" title="" alt="卡拉云可一键接入常见的数据库及 API"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可一键接入常见的数据库及 API&lt;/p&gt;

&lt;p&gt;卡拉云可根据公司工作流需求，轻松搭建数据看板，并且可分享给组内的小伙伴共享数据&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/5400a60956e16d655e0297c5d6e5a8d2/98-kalacloud-gif.gif" title="" alt="仅需拖拽即可生成前端组件"&gt;&lt;/p&gt;

&lt;p&gt;下图为使用卡拉云在 5 分钟内搭建的「优惠券发放核销」后台，仅需要简单拖拽即可快速生成前端组件，只要会写 SQL，便可搭建一套趁手的数据库工具。&lt;strong&gt;欢迎使用&lt;a href="https://kalacloud.com/?utm_medium=register" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/34625d3adaea4ed250ff3f05b863e47c/cca35/99-kalacloud-sql-index.png" title="" alt="使用卡拉云5分钟搭建优惠券发放核销系统"&gt;&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;在本教程中，我们讲解了 MySQL Workbench 操作 MySQL 数据库的基础操作。更多数据库相关教程可访问&amp;nbsp;&lt;a href="https://kalacloud.com/blog/mysql-workbench-tutorial/" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;&amp;nbsp;查看。&lt;/p&gt;

&lt;p&gt;有关 MySQL 教程，可继续拓展学习：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/difference-between-mysql-datetime-and-timestamp-datatypes/" rel="nofollow" target="_blank" title=""&gt;MySQL 时间戳用什么类型 - MySQL 时间函数详解&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-use-the-mysql-blob-data-type-to-store-images-with-php-or-kalacloud/" rel="nofollow" target="_blank" title=""&gt;MySQL 中如何实现 BLOB 数据类型的存取，BLOB 有哪些应用场景？&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-dump-database-and-ignore-or-specific-some-tables-with-mysqldump-in-mysql/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL / MariaDB 中跳过多张表导出或指定多张表导出备份&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-save-mysql-mariadb-query-output-to-a-file/" rel="nofollow" target="_blank" title=""&gt;如何将 MySQL / MariaDB 的查询结果保存到文件&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-group-by-find-first-and-last-record-in-mysql/" rel="nofollow" target="_blank" title=""&gt;MySQL 分组查询实战 如何查询每组最第一条、最后一条记录，单多字段查询、分组筛选、最大小值排序&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Tue, 23 Nov 2021 07:53:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/41910</link>
      <guid>https://ruby-china.org/topics/41910</guid>
    </item>
    <item>
      <title>Can't Connect to MySQL Server on IP Address (10061) 错误的解决方案</title>
      <description>&lt;p&gt;&lt;img src="https://kalacloud.com/static/ec10753d046e32ab397d2bda4155b339/ef245/head.jpg" title="" alt="Can't Connect to MySQL Server on IP Address (10061) 错误的解决方案"&gt;&lt;/p&gt;

&lt;p&gt;如果你打算从&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;远程连接 MySQL 服务器&lt;/a&gt;的话，有可能会碰到 10061 错误，这个错误特别常见，通常的错误提示是「Driver Error, Can’t connect to MySQL server on‘YOUR_IP_ADDRESS’ (10061)」&lt;/p&gt;

&lt;p&gt;导致 10061 这个错误的情况有两种&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  登录账号远程访问权限问题&lt;/li&gt;
&lt;li&gt;  MySQL 配置文件设置问题&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;本教程将详细讲解，如何针对这两种情况进行配置，以修正 10061 错误。&lt;/p&gt;

&lt;p&gt;特别提示：关于如何打开 MySQL 远程访问功能，可看这篇《&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 数据库，阿里云腾讯云外网连接教程&lt;/a&gt;》，如果想开启服务器可查看这份教程，本篇教程只讲开启后，为什么会出现 10061 错误。另外推荐一下卡拉云，只要你能写 SQL，不会任何前端也可以用&lt;a href="https://kalacloud.com/" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;快速搭建属于自己的后台管理系统，详见本文文末&lt;/p&gt;
&lt;h2 id="一. 授权登录 MySQL 服务器的账号远程访问权限"&gt;一。授权登录 MySQL 服务器的账号远程访问权限&lt;/h2&gt;
&lt;p&gt;如果账号没有远程访问权限或 host 配置错误，会导致 10061 错误。我们可以新建一个账号用于远程登录，也可以修改已有账号的 host 配置，使它可以远程访问。&lt;/p&gt;
&lt;h3 id="1. 新建用于远程登录的 MySQL 账号"&gt;1. 新建用于远程登录的 MySQL 账号&lt;/h3&gt;
&lt;p&gt;MySQL 用户账号是否可以远程登录，取决于账号中的&amp;nbsp;&lt;strong&gt;host&lt;/strong&gt;&amp;nbsp;配置。host 指定该账号在哪些主机上可以登录，如果是本地用户可用&amp;nbsp;&lt;strong&gt;localhost，&lt;/strong&gt; 如果是远程用户，需要指定远程计算机的 IP，如果想任意主机均可登录，那么可以使用通配符&amp;nbsp;%&lt;/p&gt;

&lt;p&gt;本教程使用通配符 % 来作为账号 host 的设置，你可以根据自己的情况将 % 改为指定主机 IP，这样可以是 MySQL 远程登录更加安全。&lt;/p&gt;

&lt;p&gt;首先登录 MySQL Server&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql -u root -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后新建一个用于远程登录的 MySQL 账号，这里的「password」换成你的密码，如果 MySQL 设置为严格密码的话，需要「数字 + 英文大小写 + 符号」&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER 'kalacloud.com-remote'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着，根据自己的需要，给你用于远程访问的账号赋予权限。下面的例子是给账号全局权限，包括创建（&lt;code&gt;CREATE&lt;/code&gt;）、修改（&lt;code&gt;ALTER&lt;/code&gt;）、删除（&lt;code&gt;DROP&lt;/code&gt;）数据库、表、用户，任意表的插入（&lt;code&gt;INSERT&lt;/code&gt;）、更新（&lt;code&gt;UPDATE&lt;/code&gt;）、删除（&lt;code&gt;DELETE&lt;/code&gt;）操作权限。可以使用&amp;nbsp;&lt;code&gt;SELECT&lt;/code&gt;&amp;nbsp;查询数据，使用&amp;nbsp;&lt;code&gt;REFERENCES&lt;/code&gt;&amp;nbsp;建立外键关系权限，以及使用&amp;nbsp;&lt;code&gt;RELOAD&lt;/code&gt;&amp;nbsp;权限执行&amp;nbsp;&lt;code&gt;FLUSH&lt;/code&gt;&amp;nbsp;操作的权限。&lt;/p&gt;

&lt;p&gt;当然，你也可以根据自己都需求，对账号权限进行调整。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'kalacloud.com-remote'@'%' WITH GRANT OPTION;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，运行 FLUSH PRIVILEGES 命令，刷新 MySQL 的系统权限相关表，更新缓存。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扩展阅读：&lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/" rel="nofollow" target="_blank" title=""&gt;最好用的 10 款 MySQL / MariaDB 管理工具横向测评&lt;/a&gt;&amp;nbsp;- 免费和付费到底怎么选？&lt;/p&gt;
&lt;h3 id="2. 将已有账号更改为可远程登录的账号"&gt;2. 将已有账号更改为可远程登录的账号&lt;/h3&gt;
&lt;p&gt;如果你不想新建账号，只是想沿用已经有的 MySQL 登录账号，那么我们也可以直接把它改为可远程登录的账号。&lt;/p&gt;

&lt;p&gt;首先，我们&lt;strong&gt;查看 MySQL 所有账号&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/ccb3b9785d374e6f46bf20c1b0baf19f/c1b63/01-SELECT-DISTINCT-CONCAT.png" title="" alt="SELECT-DISTINCT-CONCAT"&gt;&lt;/p&gt;

&lt;p&gt;接下来，我们把&amp;nbsp;&lt;code&gt;'kalacloud.com'@'localhost'&lt;/code&gt;&amp;nbsp;这个账号改为可远程登录的账号。我们把这个账号 host 改为任意主机（%）或者是固定主机 ip。可以使用 RENAME USER 命令来实现：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RENAME USER 'kalacloud.com'@'localhost' TO 'kalacloud.com'@'%';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后，再查看 MySQL 所有账号列表&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/e6ce7b2ea4ec46507556e888b4316fcf/c1b63/02-kalacloud-users-mysql.png" title="" alt="kalacloud-users-mysql"&gt;&lt;/p&gt;

&lt;p&gt;我们可以看到&amp;nbsp;&lt;code&gt;'kalacloud.com'@'localhost'&lt;/code&gt;&amp;nbsp;已经变为&amp;nbsp;&lt;code&gt;'kalacloud.com'@'%'&lt;/code&gt;&amp;nbsp;了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;特别提示&lt;/strong&gt;：如果你使用的是 MySQL 8.0，使用这个账号远程登录可能会出现&lt;code&gt;caching_sha2_password&lt;/code&gt;&amp;nbsp;报错，这是因为 MySQL 8.0 默认认证方式改为&amp;nbsp;&lt;code&gt;SHA2&lt;/code&gt;&amp;nbsp;了，如果不支持&amp;nbsp;&lt;code&gt;SHA2&lt;/code&gt;&amp;nbsp;插件认证方式，那么就会报错，比如使用 Workbench 和 Squel Pro 登录时，如下图。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/lib/plugin/caching_sha2_password.so, 2): image not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/ece301011f40bdbe1a5fb718096b3d42/e5166/03-sequel-pro.jpg" title="" alt="sequel-pro"&gt;&lt;/p&gt;

&lt;p&gt;我们可以把使用&amp;nbsp;&lt;code&gt;caching_sha2_plugin&lt;/code&gt;&amp;nbsp;认证的&lt;code&gt;'kalacloud'@'%'&lt;/code&gt;账号改为使用密码认证。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER USER 'kalacloud.com'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后运行&amp;nbsp;&lt;code&gt;FLUSH PRIVILEGES&lt;/code&gt;命令 刷新 MySQL 系统权限相关表，更新缓存&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，MySQL 远程登录账号部分就配置完成了，如果还是报 10061 错误，那么你还应该检查 MySQL 配置文件是否有问题。&lt;/p&gt;

&lt;p&gt;扩展阅读：&lt;a href="https://kalacloud.com/blog/mysql-workbench-tutorial/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench 中文使用指南&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="二. 改 MySQL 配置文件"&gt;二。改 MySQL 配置文件&lt;/h2&gt;
&lt;p&gt;在默认情况下，MySQL 数据库仅监听本地连接。如果想让外网远程连接到数据库，我们需要修改配置文件，让 MySQL 可以监听远程固定 ip 或者监听所有远程 ip。&lt;/p&gt;

&lt;p&gt;首先打开&amp;nbsp;&lt;code&gt;mysqld.cnf&lt;/code&gt;&amp;nbsp;配置文件。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到 bind - address 这一行，如下图所示。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/d44f35877e139986a0d7d50efb26a099/6ed34/04-mysqld.jpg" title="" alt="mysqld"&gt;&lt;/p&gt;

&lt;p&gt;默认情况下，bind - address 的值为 127.0.0.1，所以只能监听本地连接。我们需要将这个值改为远程连接 ip 可访问，可使用通配符 ip 地址&amp;nbsp;&lt;code&gt;*&lt;/code&gt;，&amp;nbsp;&lt;code&gt;::&lt;/code&gt;，&amp;nbsp;&lt;code&gt;0.0.0.0&lt;/code&gt;&amp;nbsp;，当然也可以是单独的固定 ip，这样就仅允许指定 ip 连接，更加安全。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/4b89be8dbd5e34ca7883d013eaa1de9f/6ed34/05-mysqld-bind-address.jpg" title="" alt="mysqld-bind-address"&gt;&lt;/p&gt;

&lt;p&gt;提示：在某些 MySQL 版本的配置文件中，没有 bind - address 这一行，这种情况下，在合适的位置加上就可以了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;提示：&lt;/strong&gt; 在某些 MySQL 版本的配置文件中，没有 bind - address 这一行，这种情况下，在合适的位置加上就可以了。&lt;/p&gt;

&lt;p&gt;更改后，保存并退出编辑器（使用 CTRL+X 保存并退出 nano 编辑器。）&lt;/p&gt;

&lt;p&gt;然后重启 MySQL 服务，使刚刚编辑的&amp;nbsp;&lt;code&gt;mysqld.cnf&lt;/code&gt;&amp;nbsp;文件生效：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扩展阅读：&lt;a href="https://kalacloud.com/blog/mysql-remove-duplicate-records/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL / MariaDB 中查找和删除重复记录？&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="三. 总结"&gt;三。总结&lt;/h2&gt;
&lt;p&gt;到这里，只要你跟着教程走，一定已经解决了 MySQL 10061 错误。&lt;/p&gt;

&lt;p&gt;MySQL 除了远程连接这类适合使用终端命令操作外，大多数对 MySQL / MariaDB 数据导入导出操作还是为了数据展示、分析、协同共享等产品和运营层面的应用场景。&lt;/p&gt;

&lt;p&gt;比如后端工程师接到产品需求，协助导出某类数据等场景，如果这类需求频繁出现，推荐使用我开发的卡拉云。卡拉云是新一代低代码开发工具，免安装部署，可一键接入包括 MySQL 在内的常见数据库及 API。&lt;/p&gt;

&lt;p&gt;卡拉云不仅可以像命令行一样灵活，还可根据自己的工作流，定制开发。无需繁琐的前端开发，只需要简单拖拽，即可快速搭建企业内部工具。&lt;strong&gt;数月的开发工作量，使用卡拉云后可缩减至数天，&lt;a href="https://kalacloud.com/" rel="nofollow" target="_blank" title=""&gt;欢迎免费试用卡拉云&lt;/a&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/18822b2a23183deb7d11dd484a7f65aa/71c1d/97-kalacloud-sql.png" title="" alt="卡拉云可快速接入的常见数据库及 API"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可快速接入的常见数据库及 API&lt;/p&gt;

&lt;p&gt;卡拉云可根据公司工作流需求，轻松搭建数据看板，并且可分享给组内的小伙伴共享数据&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/5400a60956e16d655e0297c5d6e5a8d2/98-kalacloud-gif.gif" title="" alt="仅需拖拽一键生成前端代码"&gt;&lt;/p&gt;

&lt;p&gt;仅需拖拽一键生成前端代码，简单一行代码即可映射数据到指定组件中。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/34625d3adaea4ed250ff3f05b863e47c/cca35/99-kalacloud-sql-index.png" title="" alt="卡拉云快速搭建企业内部工具"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可直接添加导出按钮，导出适用于各类分析软件的数据格式，方便快捷。&lt;a href="https://kalacloud.com/?utm_medium=register" rel="nofollow" target="_blank" title=""&gt;立即开通卡拉云&lt;/a&gt;，搭建属于自己的后台管理工具。&lt;/p&gt;

&lt;p&gt;如果觉得我的文章对你有帮助，还请点个赞再走。欢迎评论区一起交流。 &lt;/p&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Fri, 19 Nov 2021 19:10:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/41899</link>
      <guid>https://ruby-china.org/topics/41899</guid>
    </item>
    <item>
      <title>如何使用 MySQL 慢查询日志进行性能优化 - Profiling、mysqldumpslow 实例详解</title>
      <description>&lt;p&gt;&lt;img src="https://kalacloud.com/static/890db2f8674d38638465902fd2273979/ef245/head.jpg" title="" alt="使用 MySQL 慢查询日志进行性能优化"&gt;&lt;/p&gt;

&lt;p&gt;当我们开始关注数据库整体性能优化时，我们需要一套 MySQL 查询分析工具。特别是在开发中大型项目时，往往有数百个查询分布在代码库中的各个角落，并实时对数据库进行大量访问和查询。如果没有一套趁手的分析方法和工具，就很难发现在执行过程中代码的效率瓶颈，我们需要通过这套工具去定位 SQL 语句在执行中缓慢的问题和原因。&lt;/p&gt;

&lt;p&gt;本教程带领大家学习和实践 MySQL Server 内置的查询分析工具 —— 慢查询日志、&lt;code&gt;mysqldumpslow&lt;/code&gt;、&lt;code&gt;Profiling&lt;/code&gt;，详细讲解如何使用他们提升代码执行效率。如果你想根据自己的工作流开发一套数据库查询管理工具，推荐使用卡拉云。只要你会写 SQL，无需会前端也可以轻松搭建属于自己的后台查询工具，详见本文文末。&lt;/p&gt;
&lt;h2 id="一. 有关 MySQL 慢查询日志"&gt;一。有关 MySQL 慢查询日志&lt;/h2&gt;&lt;h3 id="1.慢查询日志是什么？"&gt;1.慢查询日志是什么？&lt;/h3&gt;
&lt;p&gt;MySQL 慢查询日志是用来记录 MySQL 在执行命令中，响应时间超过预设阈值的 SQL 语句。&lt;/p&gt;

&lt;p&gt;记录这些执行缓慢的 SQL 语句是优化 MySQL 数据库效率的第一步。&lt;/p&gt;

&lt;p&gt;默认情况下，慢查询日志功能是关闭的，需要我们手动打开。当然，如果不是调优需求的话，一般也不建议长期启动这个功能，因为开启慢查询多少会对数据库的性能带来一些影响。慢查询日志支持将记录写入文件，当然也可以直接写入数据库的表中。&lt;/p&gt;
&lt;h3 id="2.配置并打开慢查询日志"&gt;2.配置并打开慢查询日志&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;（1）在 MySQL Server 中临时开启慢查询功能&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;在 MySQL Server 中，默认情况慢查询功能是关闭的，我们可以通过查看此功能的状态&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;show variables like 'slow_query_log'; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/00eee2e5cee9c8afcd9b51d53d1b5342/350de/01-slow-query-log.png" title="" alt="slow_query_log"&gt;&lt;/p&gt;

&lt;p&gt;如上图所示，慢查询日志（slow_query_log）的状态为关闭。&lt;/p&gt;

&lt;p&gt;我们可以使用以下命令开启并配置慢查询日志功能，&lt;strong&gt;在 mysql 中执行以下命令&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/kalacloud-slow.log';
SET GLOBAL log_queries_not_using_indexes = 'ON';
SET SESSION long_query_time = 1;
SET SESSION min_examined_row_limit = 100;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SET GLOBAL slow_query_log&lt;/code&gt;&amp;nbsp;：全局开启慢查询功能。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SET GLOBAL slow_query_log_file&lt;/code&gt;&amp;nbsp;：指定慢查询日志存储文件的地址和文件名。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SET GLOBAL log_queries_not_using_indexes&lt;/code&gt;：无论是否超时，未被索引的记录也会记录下来。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SET SESSION long_query_time&lt;/code&gt;：慢查询阈值（秒），SQL 执行超过这个阈值将被记录在日志中。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SET SESSION min_examined_row_limit&lt;/code&gt;：慢查询仅记录扫描行数大于此参数的 SQL。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;特别注意：&lt;/strong&gt;在实践中常常会碰到无论慢查询阈值调到多小，日志就是不被记录。这个问题很有可能是&amp;nbsp;&lt;code&gt;min_examined_row_limit&lt;/code&gt;&amp;nbsp;行数过大，导致没有被记录。&lt;code&gt;min_examined_row_limit&lt;/code&gt;&amp;nbsp;在配置中常被忽略，这里要特别注意。&lt;/p&gt;

&lt;p&gt;接着我们来执行查询语句，看看配置。（在 MySQL Server 中执行）&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;show variables like 'slow_query_log%';
show variables like 'log_queries_not_using_indexes';
show variables like 'long_query_time';
show variables like 'min_examined_row_limit';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/40193134129de28aa2cb7e366f3e1ed4/5f652/02-show-variables-like.png" title="" alt="show-variables-like"&gt;&lt;/p&gt;

&lt;p&gt;以上修改 MySQL 慢查询配置的方法是用在&lt;strong&gt;临时监测数据库运行状态&lt;/strong&gt;的场景下，当 MySQL Server 重启时，以上修改全部失效并恢复原状。&lt;/p&gt;

&lt;p&gt;扩展阅读：&lt;a href="https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers/" rel="nofollow" target="_blank" title=""&gt;六类 MySQL 触发器使用教程及应用场景实战案例&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;（2）将慢查询设置写入 MySQL 配置文件，永久生效&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;虽然我们可以在命令行中对慢查询进行动态设置，但动态设置会随着重启服务而失效。如果想长期开启慢查询功能，需要把慢查询的设置写入 MySQL 配置文件中，这样无论是重启服务器，还是重启 MySQL，慢查询的设置都会保持不变。&lt;/p&gt;

&lt;p&gt;MySQL conf 配置文件通常在&amp;nbsp;&lt;code&gt;/etc&lt;/code&gt;&amp;nbsp;或&amp;nbsp;&lt;code&gt;/usr&lt;/code&gt;&amp;nbsp;中。我们可以使用&amp;nbsp;&lt;code&gt;find&lt;/code&gt;&amp;nbsp;命令找到配置文件具体的存放位置。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo find /etc -name my.cnf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/3953e9d1658e1cb75f5cb77d3ec276eb/99f37/03-sudo-find.png" title="" alt="sudo-find"&gt;&lt;/p&gt;

&lt;p&gt;找到位置后，使用&amp;nbsp;&lt;code&gt;nano&lt;/code&gt;&amp;nbsp;编辑&amp;nbsp;&lt;code&gt;my.cnf&lt;/code&gt;&amp;nbsp;将慢查询设置写入配置文件。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/mysql/my.cnf
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[mysqld]

slow-query-log = 1
slow-query-log-file = /var/log/mysql/localhost-slow.log
long_query_time = 1
log-queries-not-using-indexes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用&amp;nbsp;&lt;code&gt;nano&lt;/code&gt;&amp;nbsp;打开配置文件，把上面的的代码写在&amp;nbsp;&lt;code&gt;[mysqld]&lt;/code&gt;&amp;nbsp;的下面即可。&amp;nbsp;&lt;code&gt;ctrl+X&lt;/code&gt;&amp;nbsp;保存退出。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启 MySQL Server 服务，使刚刚修改的配置文件生效。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;特别注意：&lt;/strong&gt;直接在命令行中设置的慢查询动态变量与直接写入 my.cnf 配置文件的语法有所不同。&lt;/p&gt;

&lt;p&gt;扩展阅读：10 种&amp;nbsp;&lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/" rel="nofollow" target="_blank" title=""&gt;MySQL 管理工具&lt;/a&gt;&amp;nbsp;横向测评 - 免费和付费到底怎么选？&lt;/p&gt;

&lt;p&gt;举例：动态变量是&lt;code&gt;slow_query_log&lt;/code&gt;，写入配置文件是&lt;code&gt;slow-query-log&lt;/code&gt;。这里要特别注意。&lt;/p&gt;

&lt;p&gt;更多 MySQL 8.0 动态变量语法可查看&amp;nbsp;&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/dynamic-system-variables.html" rel="nofollow" target="_blank" title=""&gt;MySQL 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="二. 使用慢查询功能记录日志"&gt;二。使用慢查询功能记录日志&lt;/h2&gt;
&lt;p&gt;到这里我们已经配置好慢查询功能所需要的一切。下面咱们写一个示例，在这个示例中我们来一起学习如何查看和分析慢查询日志。&lt;/p&gt;

&lt;p&gt;你可以打开两个连接到服务器的命令行窗口，一个用来写 MySQL 代码，另一个用来查看日志。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注意：以下教程中，有些代码是在命令行中执行，有些是在 MySQL Server 中执行，请注意分辨。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;登录 MySQL Server，创建一个数据库，写入一组示例数据。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE DATABASE kalacloud_demo;
USE kalacloud_demo;
CREATE TABLE users ( id TINYINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) );
INSERT INTO users (name) VALUES ('Jack Ma'),('Lei Jun'),('Wang Xing'),('Pony Ma'),('Zhang YiMing'),('Ding Lei'),('Robin Li'),('Xu Yong'),('Huang Zheng'),('Richard Liu');
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了保证大家与教程配置保持一致，咱们一起使用动态变量，再设置一边慢查询参数。&lt;/p&gt;

&lt;p&gt;在 MySQL Server 中执行以下 SQL 代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET GLOBAL slow_query_log = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/kalacloud-slow.log';
SET GLOBAL log_queries_not_using_indexes = 1;
SET long_query_time = 10;
SET min_examined_row_limit = 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在我们有了一个表中有数据的示例数据库。慢查询功能也已经打开，我们特意把时间阈值（long_query_time）设置为 10 并且把最小行（min_examined_row_limit）设置为 0。&lt;/p&gt;

&lt;p&gt;接着我们来运行一段代码测试一下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;USE kalacloud_demo;
SELECT * FROM users WHERE id = 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用主键索引对表进行&amp;nbsp;&lt;code&gt;select&lt;/code&gt;&amp;nbsp;查询，这种查询速度非常快，又使用了索引。因此慢查询日志中不会有任何记录。&lt;/p&gt;

&lt;p&gt;我们打开慢查询日志，验证一下是否有记录，在命令行中执行以下命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo cat /var/log/mysql/kalacloud-slow.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到&lt;code&gt;kalacloud-slow.log&lt;/code&gt;还没有任何记录。
&lt;img src="https://kalacloud.com/static/415badf1b06c670bdfffe14ff8ccdd56/5fc9a/04-kalacloud-slow-log.png" title="" alt="kalacloud-slow-log"&gt;&lt;/p&gt;

&lt;p&gt;接着我们在 MySQL Server 中执行以下代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM users WHERE name = 'Wang Xing';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段查询代码使用非索引列（name）来进行查询，所以慢查询日志在会记录下这个查询。&lt;/p&gt;

&lt;p&gt;我们打开日志查看记录变化：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo cat /var/log/mysql/kalacloud-slow.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/9731bcba62083712ead0b5c4d12fc322/5fc9a/05-cat.png" title="" alt="通过 cat 查看 log"&gt;&lt;/p&gt;

&lt;p&gt;我们可以看到这个非索引查询，已经被记录在慢查询日志中了。&lt;/p&gt;

&lt;p&gt;再举个例子。我们提高最小检查行（min_examined_row_limit）的检查行数设置为 100，然后再执行查询。&lt;/p&gt;

&lt;p&gt;在 MySQL Server 中执行以下代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET min_examined_row_limit = 100;
SELECT * FROM users WHERE name = 'Zhang YiMing';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后，再打开&amp;nbsp;&lt;code&gt;kalacloud-slow.log&lt;/code&gt;&amp;nbsp;，可以看到条小于&amp;nbsp;&lt;code&gt;100&lt;/code&gt;&amp;nbsp;行的查询，没有被记录到日志中。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;特别注意&lt;/strong&gt;：如果慢查询日志中，没有记录任何数据，可以检查以下内容。&lt;/p&gt;

&lt;p&gt;（1）创建日志的目录权限问题，是否有对应的权限。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /var/log
mkdir mysql
chmod 755 mysql
chown mysql:mysql mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;（2）另一个可能是查询变量配置问题，把&amp;nbsp;&lt;code&gt;my.conf&lt;/code&gt;&amp;nbsp;文件内有关慢查询的配置清干净，然后重启服务，重新配置。看看是不是这里出的问题。&lt;/p&gt;

&lt;p&gt;扩展阅读：&lt;a href="https://kalacloud.com/blog/how-to-save-mysql-mariadb-query-output-to-a-file/" rel="nofollow" target="_blank" title=""&gt;如何将 MySQL 的查询结果保存到文件&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="三. 慢查询日志记录参数详解"&gt;三。慢查询日志记录参数详解&lt;/h2&gt;
&lt;p&gt;接着我们来讲解慢查询日志应该如何分析&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/be6eaa33dcd8d251aa7050a378379582/5fc9a/06-cat-mysql.png" title="" alt="慢查询日志分析"&gt;&lt;/p&gt;

&lt;p&gt;日志中信息的说明：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;Time&lt;/code&gt;&amp;nbsp;：被日志记录的代码在服务器上的运行时间。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;User@Host&lt;/code&gt;：谁执行的这段代码。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Query_time&lt;/code&gt;：这段代码运行时长。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Lock_time&lt;/code&gt;：执行这段代码时，锁定了多久。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Rows_sent&lt;/code&gt;：慢查询返回的记录。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Rows_examined&lt;/code&gt;：慢查询扫描过的行数。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些被记录的信息非常有意义，所有超过阈值的代码都会被记录在日志中，我们可以通过这些信息找到 MySQL 查询时效率不佳的代码，有助于我们优化 MySQL 性能。&lt;/p&gt;

&lt;p&gt;扩展阅读：&lt;a href="https://kalacloud.com/blog/find-all-tables-with-specific-column-names-in-mysql/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL 里查询数据库中带有某个字段的所有表名&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="四. 使用 mysqldumpslow 工具对慢查询日志进行分析"&gt;四。使用 mysqldumpslow 工具对慢查询日志进行分析&lt;/h2&gt;
&lt;p&gt;实际工作中，慢查询日志可不像上文描述的那样，仅仅有几行记录。现实中慢查询日志会记录大量慢查询信息，写入也非常频繁。日志记录的内容会越来越长，分析数据也变的困难。好在 MySQL 内置了&amp;nbsp;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;工具，它可以把相同的 SQL 归为一类，并统计出归类项的执行次数和每次执行的耗时等一系列对应的情况。&lt;/p&gt;

&lt;p&gt;我们先来执行几行代码让慢查询日志记录下来，然后再用&amp;nbsp;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;进行分析。&lt;/p&gt;

&lt;p&gt;上文我们把&lt;code&gt;min_examined_row_limit&lt;/code&gt;&amp;nbsp;设置为 100，在这里，我们要将它改为 0，慢查询才能有记录。在 MySQL Server 中执行以下代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET min_examined_row_limit = 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着我们执行几条查询命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM users WHERE name = 'Wang Xing';
SELECT * FROM users WHERE name = 'Huang Zheng';
SELECT * FROM users WHERE name = 'Zhang YiMing';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据前文的慢查询设置，这三条记录都将被记录在日志中。&lt;/p&gt;

&lt;p&gt;现在，&lt;strong&gt;我们切换到命令行的窗口中&lt;/strong&gt;，执行&amp;nbsp;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mysqldumpslow -s at /var/log/mysql/kalacloud-slow.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回的数据：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/7d12184d72cf0935032f15ce0a97b277/b8bf8/07-mysqldumpslow.png" title="" alt="mysqldumpslow"&gt;&lt;/p&gt;

&lt;p&gt;我们可以看到，返回的数据中，已经把三条类似的 SQL 语句记录抽象成一条记录&lt;code&gt;SELECT * FROM users WHERE name = 'S'&lt;/code&gt;&amp;nbsp;并且针对这条记录列出了对应的总量和平均量的记录。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;常见的&lt;/strong&gt;&amp;nbsp;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;&lt;strong&gt;命令&lt;/strong&gt;&amp;nbsp;平时大家也可以根据自己的常用需求来总结，存好这些脚本备用。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;mysqldumpslow -s at -t 10 kalacloud-slow.log&lt;/code&gt;：平均执行时长最长的前 10 条 SQL 代码。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;mysqldumpslow -s al -t 10 kalacloud-slow.log&lt;/code&gt;：平均锁定时间最长的前 10 条 SQL 代码。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;mysqldumpslow -s c -t 10 kalacloud-slow.log&lt;/code&gt;：执行次数最多的前 10 条 SQL 代码。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;mysqldumpslow -a -g 'user' kalacloud-slow.log&lt;/code&gt;：显示所有&amp;nbsp;&lt;code&gt;user&lt;/code&gt;&amp;nbsp;表相关的 SQL 代码的具体值&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;mysqldumpslow -a kalacloud-slow.log&lt;/code&gt;：直接显示 SQL 代码的情况。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;的参数命令&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

  --verbose    verbose
  --debug      debug
  --help       write this text to standard output
  -v           verbose
  -d           debug
  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                al: average lock time
                ar: average rows sent
                at: average query time
                 c: count
                 l: lock time
                 r: rows sent
                 t: query time
  -r           reverse the sort order (largest last instead of first)
  -t NUM       just show the top n queries
  -a           don't abstract all numbers to N and strings to 'S'
  -n NUM       abstract numbers with at least n digits within names
  -g PATTERN   grep: only consider stmts that include this string
  -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
               default is '*', i.e. match all
  -i NAME      name of server instance (if using mysql.server startup script)
  -l           don't subtract lock time from total time
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用的参数讲解：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-s&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  al：平均锁定时间&lt;/li&gt;
&lt;li&gt;  at：平均查询时间&amp;nbsp;[默认]&lt;/li&gt;
&lt;li&gt;  ar：平均返回记录时间&lt;/li&gt;
&lt;li&gt;  c：count 总执行次数&lt;/li&gt;
&lt;li&gt;  l：锁定时间&lt;/li&gt;
&lt;li&gt;  r：返回记录&lt;/li&gt;
&lt;li&gt;  t：查询时间&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;-t&lt;/code&gt;：返回前 N 条的数据&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-g&lt;/code&gt;：可写正则表达，类似于 grep 命令，过滤出需要的信息。如，只查询 X 表的慢查询记录。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-r&lt;/code&gt;：rows sent 总返回行数。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;日志查询工具好用就好用在它特别灵活，又可以合并同类项式的分析慢查询日志。我们在日常工作的使用中，就能够体会&amp;nbsp;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;的好用之处。&lt;/p&gt;

&lt;p&gt;另外&amp;nbsp;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;的使用参数也可在&amp;nbsp;&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldumpslow.html" rel="nofollow" target="_blank" title=""&gt;MySQL 8.0 使用手册&lt;/a&gt;&amp;nbsp;中找到。&lt;/p&gt;

&lt;p&gt;扩展阅读：&lt;a href="https://kalacloud.com/blog/how-to-get-the-sizes-of-the-tables-of-a-mysql-database/" rel="nofollow" target="_blank" title=""&gt;如何查看 MySQL 数据库、表、索引容量大小&lt;/a&gt;？找到占用空间最大的表&lt;/p&gt;
&lt;h2 id="五. Profilling - MySQL 性能分析工具"&gt;五。Profilling - MySQL 性能分析工具&lt;/h2&gt;
&lt;p&gt;为了更精准的定位一条 SQL 语句的性能问题，我们需要拆分这条语句运行时到底在什么地方消耗了多少资源。我们可以使用 Profilling 工具来进行这类细致的分析。我们可通过 Profilling 工具获取一条 SQL 语句在执行过程中对各种资源消耗的细节。&lt;/p&gt;

&lt;p&gt;进入 MySQL Server 后，执行以下代码，启动 Profilling&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET SESSION profiling = 1; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查 profiling 的状态&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT @@profiling;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回数据：0 表示未开启，1 表示已开启。
&lt;img src="https://kalacloud.com/static/92145f415c86b1b124d3cf4f9dca4542/d48f1/08-profiling.png" title="" alt="profiling"&gt;&lt;/p&gt;

&lt;p&gt;执行需要定位问题的 SQL 语句。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;USE kalacloud_demo;
SELECT * FROM users WHERE name = 'Jack Ma';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 SQL 语句状态。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHOW PROFILES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开 profiling 后，&lt;code&gt;SHOW PROFILES;&lt;/code&gt;&amp;nbsp;会显示一个将&amp;nbsp;&lt;code&gt;Query_ID&lt;/code&gt;&amp;nbsp;链接到 SQL 语句的表。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/473bd36358238e8ba1b548995cb08ec5/36eca/09-show-profiles.png" title="" alt="show-profiles"&gt;
&lt;code&gt;Query_ID&lt;/code&gt;：SQL 语句的 ID 编号。
&lt;code&gt;Duration&lt;/code&gt;：SQL 语句执行时长。
&lt;code&gt;Query&lt;/code&gt;：具体的 SQL 语句。&lt;/p&gt;

&lt;p&gt;执行以下 SQL 代码，将&amp;nbsp;&lt;code&gt;[# Query_ID]&lt;/code&gt;&amp;nbsp;替换为我们要分析的 SQL 代码&lt;code&gt;Query_ID&lt;/code&gt;的编号。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHOW PROFILE CPU, BLOCK IO FOR QUERY [# Query_ID];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHOW PROFILE CPU, BLOCK IO FOR QUERY 4;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/cdde8f424bc279ec82311770be4cf461/c1b63/10-show-profiles-all.png" title="" alt="show-profiles-all"&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Status&lt;/code&gt;&amp;nbsp;是执行查询过程中的具体步骤，&lt;code&gt;Duration&lt;/code&gt;&amp;nbsp;是完成该步骤所需的时间（以秒为单位）。&lt;/p&gt;

&lt;p&gt;我们可以根据这些细节来具体分析，如何优化对应的 SQL 代码。&lt;/p&gt;
&lt;h2 id="六. 慢查询教程总结"&gt;六。慢查询教程总结&lt;/h2&gt;
&lt;p&gt;慢查询是让我们看到数据库真实运行状态的工具，对服务器和数据库性能优化有着指导性的意义。无论是生产环境、开发、QA，都可以谨慎的打开慢查询来记录性能日志。&lt;/p&gt;

&lt;p&gt;我们可以先把动态变量&lt;code&gt;long_query_time&lt;/code&gt;&amp;nbsp;设置的大一些，观察一下，然后在进行微调。有了慢查询日志，我们就有了优化性能的方向和目标，再使用&amp;nbsp;&lt;code&gt;mysqldumpslow&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code&gt;profiling&lt;/code&gt;&amp;nbsp;进行宏观和微观的日志分析。找到低效 SQL 语句的细节，进行微调，最终使我们的系统可以获得最佳执行性能。&lt;/p&gt;

&lt;p&gt;至此，MySQL 慢查询日志我们就讲解完了，如果你周期性的查看 log 日志，可以使用卡拉云搭一个日志看板，自己不仅查看、分析数据方便，还可以一键分享给组内的小伙伴共享数据。&lt;/p&gt;

&lt;p&gt;卡拉云是新一代低代码开发工具，免安装部署，可一键接入包括 MySQL 在内的常见数据库及 API。不仅可以像命令行一样灵活，还可根据自己的工作流，定制开发。无需繁琐的前端开发，只需要简单拖拽，即可快速搭建企业内部工具。&lt;strong&gt;数月的开发工作量，使用卡拉云后可缩减至数天&lt;/strong&gt;，欢迎使用我开发的&lt;a href="https://kalacloud.com/?utm_medium=register" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/18822b2a23183deb7d11dd484a7f65aa/71c1d/97-kalacloud-sql.png" title="" alt="卡拉云可快速接入的常见数据库及 API"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可快速接入的常见数据库及 API&lt;/p&gt;

&lt;p&gt;卡拉云可根据公司工作流需求，轻松搭建数据看板，并且可分享给组内的小伙伴共享数据&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/5400a60956e16d655e0297c5d6e5a8d2/98-kalacloud-gif.gif" title="" alt="快速搭建企业内部工具"&gt;&lt;/p&gt;

&lt;p&gt;仅需拖拽一键生成前端代码，简单一行代码即可映射数据到指定组件中。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/34625d3adaea4ed250ff3f05b863e47c/cca35/99-kalacloud-sql-index.png" title="" alt="卡拉云搭建数据库看板"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可直接添加导出按钮，导出适用于各类分析软件的数据格式，方便快捷。立即开通&lt;a href="https://kalacloud.com/?utm_medium=register" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;，快速搭建属于你自己的后台管理系统。&lt;/p&gt;

&lt;p&gt;有关 MySQL 教程，可继续拓展学习：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 数据库，阿里云腾讯云外网连接教程&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-import-and-export-databases-excel-csv-in-mysql-or-mariadb-from-terminal/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL / MariaDB 中导入导出数据，导入导出数据库文件、Excel、CSV&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-migrate-a-mysql-database-between-two-servers-aliyun-tencentyun/" rel="nofollow" target="_blank" title=""&gt;如何在两台服务器之间迁移 MySQL 数据库 阿里云腾讯云迁移案例&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-use-the-mysql-blob-data-type-to-store-images-with-php-or-kalacloud/" rel="nofollow" target="_blank" title=""&gt;MySQL 中如何实现 BLOB 数据类型的存取，BLOB 有哪些应用场景？&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/mysql-workbench-tutorial/" rel="nofollow" target="_blank" title=""&gt;如何使用 MySQL Workbench 操作 MySQL / MariaDB 数据库中文指南&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Thu, 18 Nov 2021 00:16:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/41891</link>
      <guid>https://ruby-china.org/topics/41891</guid>
    </item>
    <item>
      <title>MySQL / MariaDB 触发器的创建、使用、查看、删除教程及应用场景实战案例</title>
      <description>&lt;p&gt;&lt;img src="https://kalacloud.com/static/0fd7f49674f5905a18cfa04d8c0c8b6a/ef245/head.jpg" title="" alt="MySQL 触发器"&gt;&lt;/p&gt;

&lt;p&gt;本文首发：&lt;a href="https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers/" rel="nofollow" target="_blank" title=""&gt;https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;触发器（Trigger）是 MySQL 中非常实用的一个功能，它可以在操作者对表进行「增删改」之前（或之后）被触发，自动执行一段事先写好的 SQL 代码。&lt;/p&gt;

&lt;p&gt;本教程带领大家在实践中学习，你将学到触发器在实际应用场景中的重要应用。&lt;/p&gt;

&lt;p&gt;在这个教程中，你是「卡拉云银行」的程序员，你正在搭建一套银行客户管理系统。在这套系统中，你需要设置在&lt;code&gt;INSERT&lt;/code&gt; 表之前检测操作者是否输入错误数据、在 &lt;code&gt;UPDATE&lt;/code&gt; 时，记录操作者的行为 log，以及在&lt;code&gt;DELETE&lt;/code&gt; 时，判断删除的信息是否符合删除规则。这三类操作都可以使用 MySQL 触发器来实现。&lt;/p&gt;

&lt;p&gt;如果你正在数据库的基础上搭建一套数据库管理工具或企业内部工具，推荐你试试我开发的&lt;a href="https://kalacloud.com" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;，详情见后文。&lt;/p&gt;

&lt;p&gt;本教程将带你一起实践的案例&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BEFORE INSERT&lt;/code&gt; ：在插入数据前，检测插入数据是否符合业务逻辑，如不符合返回错误信息。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AFTER INSERT&lt;/code&gt; ：在表 A 创建新账户后，将创建成功信息自动写入表 B 中。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BEFORE UPDATE&lt;/code&gt; ：在更新数据前，检测更新数据是否符合业务逻辑，如不符合返回错误信息。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AFTER INSERT&lt;/code&gt; ：在更新数据后，将操作行为记录在 log 中&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BEFORE DELETE&lt;/code&gt; ：在删除数据前，检查是否有关联数据，如有，停止删除操作。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AFTER DELETE&lt;/code&gt; ：删除表 A 信息后，自动删除表 B 中与表 A 相关联的信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="先决条件"&gt;先决条件&lt;/h2&gt;
&lt;p&gt;在开始之前，请确保您具备以下条件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;一台配置好的 Ubuntu 服务器，root 账号。&lt;/li&gt;
&lt;li&gt;服务器上配置好 MySQL Server（配置 MySQL 请看&lt;a href="https://kalacloud.com/blog/how-to-install-linux-apache-mysql-php-lamp-stack/" rel="nofollow" target="_blank" title=""&gt;MySQL 安装&lt;/a&gt;及&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;连接 MySQL 教程&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;MySQL root 账号&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="创建示例数据库"&gt;创建示例数据库&lt;/h2&gt;
&lt;p&gt;我们先创建一个干净的示例数据库，方便大家可以跟随本教程一起实践。我们会在这个数据库中演示 MySQL 触发器的多种工作方式。&lt;/p&gt;

&lt;p&gt;首先，以 root 身份登录到你的 MySQL 服务器：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现提示时，请输入你 MySQL root 账号的密码，然后点击 &lt;code&gt;ENTER&lt;/code&gt; 继续。看到 &lt;code&gt;mysql&amp;gt;&lt;/code&gt; 提示后，运行以下命令，创建 &lt;code&gt;demo_kalacloud&lt;/code&gt; 数据库：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;database&lt;/span&gt; &lt;span class="n"&gt;demo_kalacloud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 1 row affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，切换到新建的 &lt;code&gt;demo_kalacloud&lt;/code&gt; 数据库：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;demo_kalacloud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Database changed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着创建一个 &lt;code&gt;customers&lt;/code&gt; 表。我们使用这个表记录银行客户的信息。这个表包括 &lt;code&gt;customer_id&lt;/code&gt;，&lt;code&gt;customer_name&lt;/code&gt;，和&lt;code&gt;level&lt;/code&gt;。咱们先把客户分为两个级别：&lt;code&gt;BASIC&lt;/code&gt;和&lt;code&gt;VIP&lt;/code&gt;。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
&lt;span class="n"&gt;customer_name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
&lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;INNODB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 0 rows affected (0.01 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着，我们向 &lt;code&gt;customers&lt;/code&gt; 表中添加一些客户记录。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;
&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Jack Ma'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'BASIC'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Robin Li'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'BASIC'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Pony Ma'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'VIP'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分别运行三个 &lt;code&gt;INSERT&lt;/code&gt; 命令后，命令行输出成功信息。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 1 row affected (0.01 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们使用 &lt;code&gt;SELECT&lt;/code&gt; 检查一下三条信息是否已经写入表中：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/884ce259e7ad472b46da683b123e22cf/e2d3b/02-select-customers-tables.png" title="" alt="显示 customers 表"&gt;&lt;/p&gt;

&lt;p&gt;下面我们创建另一个表&lt;code&gt;customer_status&lt;/code&gt;，用于保存 &lt;code&gt;customers&lt;/code&gt; 表中客户的备注信息。&lt;/p&gt;

&lt;p&gt;这个表包含 &lt;code&gt;customer_id&lt;/code&gt; 和 &lt;code&gt;status_notes&lt;/code&gt; 字段：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;customer_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status_notes&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;INNODB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，我们再创建一个 &lt;code&gt;sales&lt;/code&gt; 表，这个表与 &lt;code&gt;customer_id&lt;/code&gt; 关联。保存与客户有关的销售数据。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sales_amount&lt;/span&gt; &lt;span class="nb"&gt;DOUBLE&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;INNODB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 0 rows affected (0.01 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后一步，我们再建一个 &lt;code&gt;audit_log&lt;/code&gt; 表，用来记录操作员操作「卡拉云银行」客户管理系统时的操作行为。方便管理员在发生问题时，有 log 可查。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sales_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;previous_amount&lt;/span&gt; &lt;span class="nb"&gt;DOUBLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_amount&lt;/span&gt; &lt;span class="nb"&gt;DOUBLE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updated_by&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;updated_on&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;INNODB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 0 rows affected (0.02 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，你作为「卡拉云银行」的程序员，已经把客户管理系统的&lt;code&gt;demo_kalacloud&lt;/code&gt; 数据库和四张表建立完成。接下来，我们将对这个管理系统的关键节点增加对应的触发器。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-use-mysql-slow-query-log-profiling-mysqldumpslow/" rel="nofollow" target="_blank" title=""&gt;如何使用 MySQL 慢查询日志进行性能优化 - Profiling、mysqldumpslow 实例详解&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="1.BEFORE INSERT触发器使用方法"&gt;1.&lt;code&gt;BEFORE INSERT&lt;/code&gt;触发器使用方法&lt;/h2&gt;
&lt;p&gt;作为严谨的银行客户管理系统，对任何写入系统的数据都应该提前检测，以防止错误的信息被写进去。&lt;/p&gt;

&lt;p&gt;在写入前检测数据这个功能，我们可以使用&lt;code&gt;BEFORE INSERT&lt;/code&gt; 触发器来实现。&lt;/p&gt;

&lt;p&gt;在操作者对 &lt;code&gt;sales&lt;/code&gt; 表中的&lt;code&gt;sales_amount&lt;/code&gt; 字段进行写操作时，系统将在写入（&lt;code&gt;INSERT&lt;/code&gt;）前检查数据是否符合规范。&lt;/p&gt;

&lt;p&gt;我们先来看一下，&lt;strong&gt;创建触发器的基本语法&lt;/strong&gt;。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;触发器的名字&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;触发器执行时机&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;触发器监测的对象&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;表名&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;触发器主体代码&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;触发器的结构包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DELIMITER //&lt;/code&gt;：MySQL 默认分隔符是&lt;code&gt;;&lt;/code&gt; 但在触发器中，我们使用 &lt;code&gt;//&lt;/code&gt; 表示触发器的开始与结束。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[触发器的名字]&lt;/code&gt;：这里填写触发器的名字&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[触发器执行时机]&lt;/code&gt;：这里设置触发器是在关键动作执行之前触发，还是执行之后触发。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[触发器监测的对象]&lt;/code&gt;：触发器可以监测 &lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt; 的操作，当监测的命令对触发器关联的表进行操作时，触发器就被激活了。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[表名]&lt;/code&gt;：将这个触发器与数据库中的表进行关联，触发器定义在表上，也附着在表上，如果这个表被删除了，那么这个触发器也随之被删除。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FOR EACH ROW&lt;/code&gt;：这句表示只要满足触发器触发条件，触发器都会被执行，也就是说带上这个参数后，触发器将监测每一行对关联表操作的代码，一旦符合条件，触发器就会被触发。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[触发器主体代码]&lt;/code&gt;：这里是当满足触发条件后，被触发执行的代码主体。这里可以是一句 SQL 语句，也可以是多行命令。如果是多行命令，那么这些命令要写在 &lt;code&gt;BEGIN...END&lt;/code&gt; 之间。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt;在创建触发器主体时，还可以使用&lt;code&gt;OLD&lt;/code&gt;和&lt;code&gt;NEW&lt;/code&gt; 来获取 SQL 执行&lt;code&gt;INSERT&lt;/code&gt;，&lt;code&gt;UPDATE&lt;/code&gt;和&lt;code&gt;DELETE&lt;/code&gt; 操作前后的写入数据。这里没看明白没关系，我们将会在接下来的实践中，展开讲解。&lt;/p&gt;

&lt;p&gt;讲到这里，大家看了一大堆云里雾里的概念，如果没看懂，也别担心。接下来进入实践环节，只要跟着贴代码看返回结果，很快你就能够通透理解触发器了。&lt;/p&gt;

&lt;p&gt;现在，我们来创建第一个触发器，&lt;code&gt;BEFORE INSERT&lt;/code&gt; （在执行 &lt;code&gt;insert&lt;/code&gt; 之前，执行触发器）。这个触发器用于监测操作者在写入 &lt;code&gt;sales&lt;/code&gt; 表中的 &lt;code&gt;sales_amount&lt;/code&gt; 值时，这个值是否大于 &lt;code&gt;10000&lt;/code&gt; ，如果大于，那么返回错误信息进行报错。&lt;/p&gt;

&lt;p&gt;登录 MySQL Server 后，我们创建一个触发器：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;validate_sales_amount&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sales_amount&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
&lt;span class="n"&gt;SIGNAL&lt;/span&gt; &lt;span class="k"&gt;SQLSTATE&lt;/span&gt; &lt;span class="s1"&gt;'45000'&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;MESSAGE_TEXT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"你输入的销售总额超过 10000 元。"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面这段代码中，我们使用&lt;code&gt;IF...THEN...END IF&lt;/code&gt; 来创建一个监测 &lt;code&gt;INSERT&lt;/code&gt; 语句写入的值是否在限定的范围内的触发器。&lt;/p&gt;

&lt;p&gt;这个触发器的功能时监测 &lt;code&gt;INSERT&lt;/code&gt; 在写入&lt;code&gt;sales_amount&lt;/code&gt; 值时，这个新增的（&lt;code&gt;NEW&lt;/code&gt;）值是否符合条件（ &lt;code&gt;&amp;gt; 10000&lt;/code&gt;）。&lt;/p&gt;

&lt;p&gt;当操作员录入一个超过 10000 的数字，会返回如下错误信息：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '你输入的销售总额超过 10000 元。';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们来试试看，看看触发器是否已启用。&lt;/p&gt;

&lt;p&gt;我们向 &lt;code&gt;sales_amount&lt;/code&gt; 中插入一条 &lt;code&gt;11000&lt;/code&gt; 的值。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sales_amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'11000'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/dee0dc83297e4164d3f60676d922e277/ca3c3/03-error-1644.png" title="" alt="ERROR 1644 触发器不允许写入"&gt;&lt;/p&gt;

&lt;p&gt;命令行返回错误信息，这就是我们刚刚创建触发器时，填入的错误信息。与我们的设置一致。&lt;/p&gt;

&lt;p&gt;下面我们 &lt;code&gt;insert&lt;/code&gt; 一个值小于 &lt;code&gt;10000&lt;/code&gt; 的数字：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt;  &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sales_amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'7700'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入值为 &lt;code&gt;7700&lt;/code&gt; 小于设定的 &lt;code&gt;10000&lt;/code&gt;  ，&lt;code&gt;insert&lt;/code&gt; 命令执行成功。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 1 row affected (0.01 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们调出 &lt;code&gt;sales&lt;/code&gt; 表，看看是否插入成功：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出确认数据在表中：&lt;/p&gt;

&lt;p&gt;![确认数据在表中]](&lt;a href="https://kalacloud.com/static/6a4d3093e730b33651a25d716fb6c765/29beb/04-insert-into.png" rel="nofollow" target="_blank"&gt;https://kalacloud.com/static/6a4d3093e730b33651a25d716fb6c765/29beb/04-insert-into.png&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;通过这张表，我们可以看到，7700 已经插入到表中。&lt;/p&gt;

&lt;p&gt;刚刚我们演示了在执行 &lt;code&gt;insert&lt;/code&gt; 命令前，检测某个值是否符合设定，接着我们来看在执行 &lt;code&gt;insert&lt;/code&gt; 之后，使用触发器将不同的值保存到不同的表中。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;扩展阅读：&lt;/strong&gt;《&lt;a href="https://kalacloud.com/blog/how-to-migrate-a-mysql-database-between-two-servers-aliyun-tencentyun/" rel="nofollow" target="_blank" title=""&gt;如何在两台服务器之间迁移 MySQL / MariaDB 数据库 阿里云腾讯云迁移案例&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="2.AFTER INSERT触发器使用方法"&gt;2.&lt;code&gt;AFTER INSERT&lt;/code&gt;触发器使用方法&lt;/h2&gt;
&lt;p&gt;接着我们讲解 &lt;code&gt;AFTER INSERT&lt;/code&gt; ，触发器在监测到我们成功执行了 &lt;code&gt;INSERT&lt;/code&gt; 命令后，再执行触发器中设置好的代码。&lt;/p&gt;

&lt;p&gt;例如：在银行账户系统中，当我们新建一个账户后，我们将创建成功信息写入对应的 &lt;code&gt;customer_status&lt;/code&gt; 表中。&lt;/p&gt;

&lt;p&gt;在这个案例中，你作为「卡拉云银行」的程序员，现在要创建一个&lt;code&gt;AFTER INSERT&lt;/code&gt;触发器，在创建新客户账户后，将成功信息写入&lt;code&gt;customer_status&lt;/code&gt; 表中&lt;/p&gt;

&lt;p&gt;要创建&lt;code&gt;AFTER INSERT&lt;/code&gt;触发器，请输入以下命令：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;customer_status_records&lt;/span&gt;
&lt;span class="k"&gt;AFTER&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;customer_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status_notes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'账户创建成功'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 0 rows affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个触发器在操作者向 &lt;code&gt;customers&lt;/code&gt; 表中 &lt;code&gt;INSERT&lt;/code&gt; 新客户信息后，再向 &lt;code&gt;customer_status&lt;/code&gt; 表对应的行中写入成功信息。&lt;/p&gt;

&lt;p&gt;现在我们 &lt;code&gt;INSERT&lt;/code&gt; 一条信息，看看触发器是否已启用：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Xing Wang'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'VIP'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 1 row affected (0.01 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;记录 &lt;code&gt;INSERT&lt;/code&gt; 成功，接着我们来检查&lt;code&gt;customer_status&lt;/code&gt;表中是否写入了对应的成功数据。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;customer_status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/fbe9ada62cf8fe333997165f762993a4/79166/05-insert-into-01.png" title="" alt="检查是否成功"&gt;&lt;/p&gt;

&lt;p&gt;这里可以看到，我们向 &lt;code&gt;customers&lt;/code&gt;  表插入了一个&lt;code&gt;customer_id&lt;/code&gt; 为 &lt;code&gt;4&lt;/code&gt; 的新用户，随后，触发器根据代码自动向&lt;code&gt;customer_status&lt;/code&gt; 表中也插入了一个 &lt;code&gt;customer_id&lt;/code&gt; 为 &lt;code&gt;4&lt;/code&gt; 的开户成功信息。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AFTER INSERT&lt;/code&gt; 特别适合这种状态变更的关联写入操作。比如开户、暂停、注销等各类状态变更。&lt;/p&gt;

&lt;p&gt;到这里，触发器在&lt;code&gt;INSERT&lt;/code&gt;执行前、后的应用，我们已经讲完了，接着我们来讲 &lt;code&gt;UPDATE&lt;/code&gt; 触发器。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;扩展阅读：&lt;/strong&gt;《&lt;a href="https://kalacloud.com/blog/how-to-edit-mysql-configuration-file-my-cnf-ini/" rel="nofollow" target="_blank" title=""&gt;MySQL 配置文件 my.cnf / my.ini 逐行详解&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="3.BEFORE UPDATE触发器使用方法"&gt;3.&lt;code&gt;BEFORE UPDATE&lt;/code&gt;触发器使用方法&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;BEFORE UPDATE&lt;/code&gt;触发器与&lt;code&gt;BEFORE INSERT&lt;/code&gt; 触发器非常类似，我们可以使用&lt;code&gt;BEFORE UPDATE&lt;/code&gt; 触发器在更新数据之前，先做一次业务逻辑检测，避免发生误操作。&lt;/p&gt;

&lt;p&gt;刚刚我们创建示例数据库时，创建了两个级别的客户，VIP 和 BASIC 级别。卡拉云银行的客户一旦升级至 VIP，就不能再降级至 BASIC 级别了。&lt;/p&gt;

&lt;p&gt;我们使用 &lt;code&gt;BEFORE UPDATE&lt;/code&gt; 来贯彻这一规则，这个触发器将在 &lt;code&gt;UPDATE&lt;/code&gt; 语句执行之前，先判断是否为降级行为，如果是，则输出报错信息。&lt;/p&gt;

&lt;p&gt;我们来创建这个触发器：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;validate_customer_level&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;OLD&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'VIP'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
&lt;span class="n"&gt;SIGNAL&lt;/span&gt; &lt;span class="k"&gt;SQLSTATE&lt;/span&gt; &lt;span class="s1"&gt;'45000'&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;MESSAGE_TEXT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'VIP 级别客户不能降级为普通级别客户'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以使用 &lt;code&gt;OLD&lt;/code&gt; 来获取执行 &lt;code&gt;UPDATE&lt;/code&gt; 命令前，客户的 &lt;code&gt;level&lt;/code&gt; 值。同样，我们使用该&lt;code&gt;IF...THEN...END IF&lt;/code&gt;语句来对 &lt;code&gt;level&lt;/code&gt; 值是否符合规则进行判断。&lt;/p&gt;

&lt;p&gt;我们先来查看一下 &lt;code&gt;customers&lt;/code&gt; 表中的数据。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; from customers&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/8eab72c0962f70db1655abeffd568fdb/e2d3b/06-validate-customer-level.png" title="" alt="不允许降级"&gt;&lt;/p&gt;

&lt;p&gt;好，我们选一个已经是 VIP 级别的客户，对他进行降级操作，看看我们的触发器是否能够正确执行。&lt;/p&gt;

&lt;p&gt;接下来，运行以下 SQL 命令，试试能不能将 &lt;code&gt;customer_id&lt;/code&gt; 为 &lt;code&gt;3&lt;/code&gt; 的 VIP 客户降级成 &lt;code&gt;BASIC&lt;/code&gt; 客户：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Update&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'BASIC'&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行代码后，命令行返回错误信息：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/387b96393c3722c02acbd9afae183da1/236d7/07-validate-customer-level-done.png" title="" alt="在允许范围内可通过"&gt;&lt;/p&gt;

&lt;p&gt;这说明我们刚刚设置的触发器已经起作用了。&lt;/p&gt;

&lt;p&gt;接着我们来试试，对一个&lt;code&gt;BASIC&lt;/code&gt;级别的客户运行相同的命令，看看能不能把他升级到&lt;code&gt;VIP&lt;/code&gt;级别：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Update&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'VIP'&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行成功：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Rows matched: 1  Changed: 1  Warnings: 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们再来看一下 &lt;code&gt;customers&lt;/code&gt; 表中的数据情况：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; from customers&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/168b1d2493f129856e0653fdd88e14dc/daed9/08-validate-customer-level-update.png" title="" alt="客户已经升级为 VIP"&gt;&lt;/p&gt;

&lt;p&gt;可以看到刚才 &lt;code&gt;customer_id&lt;/code&gt; 为 &lt;code&gt;2&lt;/code&gt; 的 &lt;code&gt;BASIC&lt;/code&gt;  客户已经升级为 &lt;code&gt;VIP&lt;/code&gt; 客户。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEFORE UPDATE&lt;/code&gt; 触发器用于在更新数据前进行确认，很好的守护了系统的业务规则。接着我们来看看 &lt;code&gt;AFTER UPDATE&lt;/code&gt; 在客户管理系统中的应用。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/mysql-workbench-tutorial/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench 操作 MySQL / MariaDB 数据库中文指南&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="4.AFTER INSERT触发器使用方法"&gt;4.&lt;code&gt;AFTER INSERT&lt;/code&gt;触发器使用方法&lt;/h2&gt;
&lt;p&gt;本节我们来演示 &lt;code&gt;AFTER UPDATE&lt;/code&gt; 在实际中的应用。&lt;code&gt;AFTER UPDATE&lt;/code&gt; &lt;strong&gt;多用于 log 记录&lt;/strong&gt;，在管理系统多操作者使用的环境中，管理员需要设置操作 log 记录，以便在出问题时，可以查看操作者对表编辑的操作，可追根溯源。&lt;/p&gt;

&lt;p&gt;我们先来创建一个对 &lt;code&gt;sales&lt;/code&gt; 表操作的 log 记录触发器。&lt;/p&gt;

&lt;p&gt;当操作者对  &lt;code&gt;sales&lt;/code&gt; 表进行修改后，操作记录会被写入 &lt;code&gt;audit_log&lt;/code&gt; 表中。&lt;/p&gt;

&lt;p&gt;触发器将监测用户 ID、更新前的销售总额、更新后的销售总额、操作者 ID、修改时间等信息，作为 log 存入 &lt;code&gt;audit_log&lt;/code&gt; 表中。&lt;/p&gt;

&lt;p&gt;使用以下命令建立这个 log 记录触发器：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;log_sales_updates&lt;/span&gt;
&lt;span class="k"&gt;AFTER&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;previous_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updated_by&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updated_on&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sales_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;OLD&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sales_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sales_amount&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当操作者对 &lt;code&gt;sales&lt;/code&gt; 表中的一条客户信息进行 &lt;code&gt;UPDATE&lt;/code&gt; 操作时，触发器会在&lt;code&gt;UPDATE&lt;/code&gt;操作之后，将操作行为记录在 &lt;code&gt;audit_log&lt;/code&gt; 中。包括 &lt;code&gt;sales_id&lt;/code&gt; ，修改 &lt;code&gt;sales_amount&lt;/code&gt; 值的前后变化。&lt;/p&gt;

&lt;p&gt;销售总额的变化是审计的关键数据，所以要把它记录在 &lt;code&gt;audit_log&lt;/code&gt; 中。使用&lt;code&gt;OLD&lt;/code&gt; 来获取更新前的 &lt;code&gt;sales_amount&lt;/code&gt; 值，使用 &lt;code&gt;NEW&lt;/code&gt; 来获取更新后的值。&lt;/p&gt;

&lt;p&gt;另外我们还要记录修改 &lt;code&gt;sales&lt;/code&gt; 表的操作者信息及操作时间。&lt;/p&gt;

&lt;p&gt;你可以使用 &lt;code&gt;SELECT USER()&lt;/code&gt; 来检测当前操作用户的账号，用 &lt;code&gt;NOW()&lt;/code&gt; 语句抓去当前服务器日期和时间。&lt;/p&gt;

&lt;p&gt;为了测试这个触发器，我们先在 &lt;code&gt;sales&lt;/code&gt; 表中创建一条信息记录：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sales_amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'8000'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 1 row affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，我们来更新这条记录：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Update&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="n"&gt;sales_amount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'9000'&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;sales_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'5'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;您将看到以下输出：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Rows matched: 1  Changed: 1  Warnings: 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理论上，我们更新了 &lt;code&gt;sales&lt;/code&gt; 表后，触发器应该触发了操作，将我们刚刚的修改记录到了&lt;code&gt;audit_log&lt;/code&gt; 表中。我们用以下命令，看看&lt;code&gt;audit_log&lt;/code&gt; 表中是否已经有记录了。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如下表，触发器更新了&lt;code&gt;audit_log&lt;/code&gt; 表，表中包含了&lt;code&gt;sales_amount&lt;/code&gt; 更新前的旧值和更新后的新值。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/65237917f89edd5e6d540febf1945e84/51dd6/09-after-update.png" title="" alt="log 自动记录触发器"&gt;&lt;/p&gt;

&lt;p&gt;至此，使用 &lt;code&gt;AFTER UPDATE&lt;/code&gt; 制作的 log 自动记录触发器就完成了。&lt;/p&gt;

&lt;p&gt;下一节，我们来学习 &lt;code&gt;DELETE&lt;/code&gt; 相关的触发器。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-get-the-sizes-of-the-tables-of-a-mysql-database/" rel="nofollow" target="_blank" title=""&gt;如何查看 MySQL 数据库、表、索引容量大小？找到占用空间最大的表&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="5.BEFORE DELETE触发器使用方法"&gt;5.&lt;code&gt;BEFORE DELETE&lt;/code&gt;触发器使用方法&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;BEFORE DELETE&lt;/code&gt;触发器会在&lt;code&gt;DELETE&lt;/code&gt;语句执行之前调用。&lt;/p&gt;

&lt;p&gt;这些类型的触发器通常用于在不同的相关表上强制执行参照完整性。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEFORE DELETE&lt;/code&gt; 的应用场景通常是确保有关联的数据不被错误的误删除掉。&lt;/p&gt;

&lt;p&gt;例如：&lt;code&gt;sales&lt;/code&gt; 表通过&lt;code&gt;customer_id&lt;/code&gt; 与&lt;code&gt;customers&lt;/code&gt;表相关联。如果操作者删除了&lt;code&gt;customers&lt;/code&gt; 表中的一条数据，那么 &lt;code&gt;sales&lt;/code&gt; 表中某些数据就失去了关联线索。&lt;/p&gt;

&lt;p&gt;为了避免这种情况的发生，我们需要创建一个 &lt;code&gt;BEFORE DELETE&lt;/code&gt;触发器，防止记录被误删除。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;validate_related_records&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;OLD&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
&lt;span class="n"&gt;SIGNAL&lt;/span&gt; &lt;span class="k"&gt;SQLSTATE&lt;/span&gt; &lt;span class="s1"&gt;'45000'&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;MESSAGE_TEXT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'这位客户有相关联的销售记录，不能删除。'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，我们试着删除有销售关联信息的客户：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Delete&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以，你会看到以下输出：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/604ec02952a1a36005433cfcb17052de/3a1b1/10-dele-not.png" title="" alt="触发器不允许删除"&gt;&lt;/p&gt;

&lt;p&gt;这个触发器做到了先检测 &lt;code&gt;sales&lt;/code&gt; 是否与正要被删除的 &lt;code&gt;customers&lt;/code&gt; 表中的数据有关联，防止有关联信息的数据被误删除。&lt;/p&gt;

&lt;p&gt;不过有时候，我们需要删除主数据后，再让系统自动帮我们删除与之相关联的其他所有数据。这时，我们就要用到 &lt;code&gt;AFTER DELETE&lt;/code&gt; 这个触发器了。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/difference-between-mysql-datetime-and-timestamp-datatypes/" rel="nofollow" target="_blank" title=""&gt;在 MySQL 中 DATETIME 和 TIMESTAMP 时间类型的区别及使用场景 - 实战案例讲解&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="6.AFTER DELETE触发器使用方法"&gt;6.&lt;code&gt;AFTER DELETE&lt;/code&gt;触发器使用方法&lt;/h2&gt;
&lt;p&gt;接着说说 &lt;code&gt;AFTER DELETE&lt;/code&gt; ，一旦记录被成功删除，这个触发器就会被激活。&lt;/p&gt;

&lt;p&gt;这个触发器在实际场景用的应用也比较广泛。比如银行系统中的升级降级操作，当客户花掉自己的账户积分后，激活触发器，触发器可以判断剩余积分是否满足客户当前等级，如果不满足，自动做降级操作。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AFTER DELETE&lt;/code&gt;触发器的另一个用途是在删除主表中的数据后，与这个主表关联的数据，一起自动删除。&lt;/p&gt;

&lt;p&gt;我们来看一下这个触发器如何创建：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;delete_related_info&lt;/span&gt;
&lt;span class="k"&gt;AFTER&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="k"&gt;Delete&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;OLD&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，我们来试试这个触发器。删除销售记录中 &lt;code&gt;customer_id&lt;/code&gt; 为 &lt;code&gt;2&lt;/code&gt; 的销售记录：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Delete&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 1 row affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着我们检查以下 &lt;code&gt;customers&lt;/code&gt; 表中的关联信息是否一起自动删除：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;命令行会返回 &lt;code&gt;Empty Set&lt;/code&gt; 的结果，我们刚刚删除了 &lt;code&gt;sales&lt;/code&gt; 表中的信息后，&lt;code&gt;customers&lt;/code&gt; 表中的关联信息也被一起删除了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/b1f04866841c4869946217ed0832c7d6/eee07/11-dele0triggers.png" title="" alt="在范围内允许删除"&gt;&lt;/p&gt;

&lt;p&gt;以上就是 MySQL 触发器的六种使用方式和对应的场景。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/" rel="nofollow" target="_blank" title=""&gt;最好用的 10 款 MySQL / MariaDB 管理工具横向测评 - 免费和付费到底怎么选？&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="7.查看触发器"&gt;7.查看触发器&lt;/h2&gt;&lt;h3 id="（1）直接查看触发器"&gt;（1）直接查看触发器&lt;/h3&gt;
&lt;p&gt;当我们想查看数据库中的触发器有哪些时，可用以下命令：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SHOW TRIGGERS&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后面加上 &lt;code&gt;\G&lt;/code&gt; 是触发器列表竖排列：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SHOW TRIGGERS &lt;span class="se"&gt;\G&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/850311b076c6112b44d4fd7a3b5ac8d0/00cd3/01-show-trigger.jpg" title="" alt="显示所有触发器"&gt;&lt;/p&gt;

&lt;p&gt;刚刚我们创建的触发器都罗列在这个列表当中了。&lt;/p&gt;
&lt;h3 id="（2）在 triggers 表中查看触发器信息"&gt;（2）在 triggers 表中查看触发器信息&lt;/h3&gt;
&lt;p&gt;在 MySQL Server 中，数据库 &lt;code&gt;information_schema&lt;/code&gt;  的 &lt;code&gt;triggers&lt;/code&gt; 表中存着所有触发器的信息。所有我们可以通过 &lt;code&gt;SELECT&lt;/code&gt; 来查看。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM information_schema.triggers WHERE &lt;span class="nv"&gt;trigger_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'触发器名称'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然，也可以不指定触发器名称，来查看所有。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SELECT &lt;span class="k"&gt;*&lt;/span&gt; FROM information_schema.triggers &lt;span class="se"&gt;\G&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/find-all-tables-with-specific-column-names-in-mysql/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL / MariaDB 中查询数据库中带有某个字段/列名的所有表名&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="8.删除触发器"&gt;8.删除触发器&lt;/h2&gt;
&lt;p&gt;最后，咱们来说说如何删除触发器。删除命令也很简单，&lt;code&gt;Drop trigger 触发器名字&lt;/code&gt; 即可。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Drop trigger [触发器名称];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如，咱们把刚刚创建的最后一个触发器删掉：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Drop&lt;/span&gt; &lt;span class="k"&gt;trigger&lt;/span&gt; &lt;span class="n"&gt;delete_related_info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
Query OK, 0 rows affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;特别提示：我们不能对已经创建好的触发器进行修改。如果你想修改，只能先删除，再重新创建。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-use-the-mysql-blob-data-type-to-store-images-with-php-or-kalacloud/" rel="nofollow" target="_blank" title=""&gt;MySQL / MariaDB 中如何存储图片 BLOB 数据类型详解&lt;/a&gt;》&lt;/p&gt;
&lt;h2 id="9.总结"&gt;9.总结&lt;/h2&gt;
&lt;p&gt;在本教程中，我们展示了触发器的六种形式，即在&lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt; 执行前或后执行触发器，以及对应的六个实战案例。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BEFORE INSERT&lt;/code&gt; ：在插入数据前，检测插入数据是否符合业务逻辑，如不符合返回错误信息。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AFTER INSERT&lt;/code&gt; ：在表 A 创建新账户后，将创建成功信息自动写入表 B 中。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BEFORE UPDATE&lt;/code&gt; ：在更新数据前，检测更新数据是否符合业务逻辑，如不符合返回错误信息。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AFTER INSERT&lt;/code&gt; ：在更新数据后，将操作行为记录在 log 中&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BEFORE DELETE&lt;/code&gt; ：在删除数据前，检查是否有关联数据，如有，停止删除操作。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AFTER DELETE&lt;/code&gt; ：删除表 A 信息后，自动删除表 B 中与表 A 相关联的信息。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;接着推荐一下卡拉云，只要你会写 MySQL，就能使用卡拉云搭建自己的数据工具，比如，数据看板，企业 CRM、ERP，权限管理后台，对账系统等。&lt;/p&gt;

&lt;p&gt;卡拉云是新一代低代码开发工具，免安装部署，可一键接入包括 MySQL 在内的常见数据库及 API。可根据自己的工作流，定制开发。无需繁琐的前端开发，只需要简单拖拽，即可快速搭建企业内部工具。&lt;strong&gt;数月的开发工作量，使用卡拉云后可缩减至数天，&lt;a href="https://kalacloud.com/" rel="nofollow" target="_blank" title=""&gt;欢迎免费试用卡拉云&lt;/a&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/18822b2a23183deb7d11dd484a7f65aa/71c1d/97-kalacloud-sql.png" title="" alt="卡拉云可一键接入常见的数据库及 API"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可一键接入常见的数据库及 API&lt;/p&gt;

&lt;p&gt;卡拉云可根据公司工作流需求，轻松搭建数据看板或其他内部工具，并且可一键分享给组内的小伙伴。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/5400a60956e16d655e0297c5d6e5a8d2/98-kalacloud-gif.gif" title="" alt="卡拉云5分钟搭建企业内部工具"&gt;&lt;/p&gt;

&lt;p&gt;下图为使用卡拉云在 5 分钟内搭建的「优惠券发放核销」后台，仅需要简单拖拽即可快速生成前端组件，只要会写 SQL，便可搭建一套趁手的数据库工具。&lt;a href="https://kalacloud.com/" rel="nofollow" target="_blank" title=""&gt;**欢迎免费试用卡拉云&lt;/a&gt;。**&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/34625d3adaea4ed250ff3f05b863e47c/cca35/99-kalacloud-sql-index.png" title="" alt="导入导出"&gt;&lt;/p&gt;

&lt;p&gt;希望本教程对你有所帮助。更多有关 MySQL 教程，欢迎访问&lt;a href="https://kalacloud.com" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;查看更多。&lt;/p&gt;

&lt;p&gt;有关 MySQL 教程，可继续拓展学习：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 数据库，阿里云腾讯云外网连接教程&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-import-and-export-databases-excel-csv-in-mysql-or-mariadb-from-terminal/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL / MariaDB 中导入导出数据，导入导出数据库文件、Excel、CSV&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-migrate-a-mysql-database-between-two-servers-aliyun-tencentyun/" rel="nofollow" target="_blank" title=""&gt;如何在两台服务器之间迁移 MySQL 数据库 阿里云腾讯云迁移案例&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://kalacloud.com/blog/how-to-reset-auto-increment-in-mysql/" rel="nofollow" target="_blank" title=""&gt;MySQL 重置自增 ID (AUTO_INCREMENT) 教程 - 完美保留表数据的终极解决方案&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Sat, 13 Nov 2021 02:01:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/41879</link>
      <guid>https://ruby-china.org/topics/41879</guid>
    </item>
    <item>
      <title>如何在 MySQL / MariaDB 中导入导出数据，导入导出数据库文件、Excel、CSV</title>
      <description>&lt;p&gt;&lt;img src="https://kalacloud.com/static/958ff4b31519eee028bfe8afb7cd0421/ef245/head.jpg" title="" alt="如何在 MySQL / MariaDB 中导入导出数据，导入导出数据库文件、Excel、CSV"&gt;&lt;/p&gt;

&lt;p&gt;在日常的数据库维护工作中，经常需要对数据库进行导入导出操作，备份、分析、迁移数据都需要用到导入导出功能，在本教程中将详细讲解所有常见的 MySQL 和 MariaDB 中导入导出数据的方法（注意：MySQL 和 MariaDB 两个数据库操作命令一样，可以互换。）&lt;/p&gt;
&lt;h2 id="本教程将详细讲解"&gt;本教程将详细讲解&lt;/h2&gt;&lt;h3 id="1. MySQL / MariaDB 数据库数据「导出」"&gt;1. MySQL / MariaDB 数据库数据「导出」&lt;/h3&gt;
&lt;p&gt;（1）使用 &lt;code&gt;mysqldump&lt;/code&gt;直接导出数据至 SQL 文件&lt;/p&gt;

&lt;p&gt;（2）阿里云 / 腾讯云远程服务器中的数据库直接导出到本地计算机&lt;/p&gt;

&lt;p&gt;（3）使用 &lt;code&gt;into outfile&lt;/code&gt;命令导出数据至 CSV / Excel&lt;/p&gt;

&lt;p&gt;提示：如果你正在寻找数据迁移方案，请查看我写的的另一篇专门针对 &lt;a href="https://kalacloud.com/blog/how-to-migrate-a-mysql-database-between-two-servers-aliyun-tencentyun/" rel="nofollow" target="_blank" title=""&gt;MySQL 数据迁移的教程&lt;/a&gt;，教程中包含腾讯云、阿里云迁移实战。&lt;/p&gt;
&lt;h3 id="2. MySQL / MariaDB 数据库数据「导入」"&gt;2. MySQL / MariaDB 数据库数据「导入」&lt;/h3&gt;
&lt;p&gt;（1）将 SQL 文件导入至 MySQL / MariaDB 数据库中&lt;/p&gt;

&lt;p&gt;（2）使用 &lt;code&gt;source&lt;/code&gt; 导入数据库 SQL 文件&lt;/p&gt;

&lt;p&gt;（3）将 CSV / Excel 文件 导入至 MySQL / MariaDB 数据库中&lt;/p&gt;
&lt;h3 id="3. 使用「卡拉云」一键导入导出 MySQL / MariaDB 数据"&gt;3. 使用「卡拉云」一键导入导出 MySQL / MariaDB 数据&lt;/h3&gt;
&lt;p&gt;如何使用卡拉云，5 分钟搭建一套适应自己工作流的一键导入导出数据库系统。卡拉云无需部署，即插即用，可根据需求灵活调配，适用于后端工程师快速搭建企业内部系统、数据产品经理查看分析数据，数据分析师根据需求快速搭建数据共享平台分享给组内同学协同查看等应用场景。点这里看详情。&lt;/p&gt;
&lt;h3 id="4. 先决条件"&gt;4. 先决条件&lt;/h3&gt;
&lt;p&gt;跟随本教程学习如何导入导出 MySQL 或 MariaDB 数据库，首先要有&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  一台 Linux 服务器，本文以 Ubuntu 为例&lt;/li&gt;
&lt;li&gt;  已安装 MySQL 或 MariaDB server（还未安装，安装教程请看这篇《&lt;a href="https://kalacloud.com/blog/how-to-install-linux-apache-mysql-php-lamp-stack/" rel="nofollow" target="_blank" title=""&gt;MySQL 安装教程&lt;/a&gt;》）&lt;/li&gt;
&lt;li&gt;  MySQL 或 MariaDB Server 中有数据库（用于导出）&lt;/li&gt;
&lt;li&gt;  教程使用 MacOS 演示本地计算机操作，此操作同时适用于 Windows 及 Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一. 导出 MySQL 或 MariaDB 数据库"&gt;
&lt;a href="https://kalacloud.com/blog/how-to-import-and-export-databases-excel-csv-in-mysql-or-mariadb-from-terminal/#%E4%B8%80-%E5%AF%BC%E5%87%BA-mysql-%E6%88%96-mariadb-%E6%95%B0%E6%8D%AE%E5%BA%93" rel="nofollow" target="_blank" title=""&gt;&lt;/a&gt;一。导出 MySQL 或 MariaDB 数据库&lt;/h2&gt;&lt;h3 id="1.如何使用&amp;nbsp;mysqldump&amp;nbsp;导出数据"&gt;1.如何使用&amp;nbsp;&lt;code&gt;mysqldump&lt;/code&gt;&amp;nbsp;导出数据&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;mysqldump&lt;/code&gt;&amp;nbsp;命令是数据库导出中使用最频繁对一个工具，它可将数据库中的数据备份成已 *.sql 结尾的文本文件，表结构和数据都会存储在其中。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mysqldump&lt;/code&gt;&amp;nbsp;命令的原理也很简单，它先把需要备份的表结构查询出来，然后生成一个&amp;nbsp;&lt;code&gt;CREATE TABLE 'table'&lt;/code&gt;&amp;nbsp;语句，最后将表中所有记录转化成一条&lt;code&gt;INSERT&lt;/code&gt;语句。&lt;/p&gt;

&lt;p&gt;可以把它理解为一个批量导出导入脚本。数据导入时，按照规范语句导入数据，大幅减少奇怪的未知错误出现。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mysqldump&lt;/code&gt;&amp;nbsp;的基本命令：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysqldump -u username -p database_name &amp;gt; data-dump.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;username&lt;/code&gt;&amp;nbsp;是数据库的登录名&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;database_name&lt;/code&gt;&amp;nbsp;是需要导出的数据库名称&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;data-dump.sql&lt;/code&gt;&amp;nbsp;是文件输出目录的文件&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;导出实战 - 从阿里云服务器中的 MySQL 数据库导出数据&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysqldump -u kalacloud -p kalacloud_database &amp;gt; /tmp/kalacloud-data-export.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/ccb5a47b7e118995b20cada7bc2149cf/11864/01-mysqldump.png" title="" alt="使用 mysqldump 导出数据"&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;kalacloud&lt;/code&gt;&amp;nbsp;：数据库账号&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;kalacloud_database&lt;/code&gt;&amp;nbsp;：数据库名&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/tmp/kalacloud-data-export.sql&lt;/code&gt;&amp;nbsp;：数据库导出的文件及存放目录&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;输入数据库&amp;nbsp;&lt;code&gt;kalacloud&lt;/code&gt;&amp;nbsp;账号的密码执行命令，如果执行过程中，没有任何错误，那么命令行不会有任何输出。&lt;/p&gt;

&lt;p&gt;我们可以 cd 到 tmp 目录查看结果。上图可以看到，tmp 目录下已经生成&amp;nbsp;&lt;code&gt;kalacloud-data-export.sql&lt;/code&gt;&amp;nbsp;的导出文件。&lt;/p&gt;

&lt;p&gt;我们在用&lt;code&gt;head -n 5 kalacloud-data-export.sql&lt;/code&gt;命令检查一下。你会看到类似下图的内容。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/468a4459e57371bdb42e9976527bc95b/62da8/02-kalacloud-data-export.png" title="" alt="检查 mysqldump 导出文件是否有错误"&gt;&lt;/p&gt;

&lt;p&gt;至此，我们已经将指定数据库导出到 *.sql 文件中了，后文我们讲解如何将这些数据导入到数据库。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;进阶提示&lt;/strong&gt;：我们可以使用&amp;nbsp;&lt;code&gt;scp&lt;/code&gt;&amp;nbsp;命令，将导出文件下载至本地计算机。&lt;/p&gt;

&lt;p&gt;在本地计算机的命令行终端里，输入：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp root@192.168.180.134:/tmp/kalacloud-data-export.sql /Users/kalacloud/Downloads
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;root&lt;/code&gt;&amp;nbsp;远程计算机的登录账号&lt;/p&gt;

&lt;p&gt;&lt;code&gt;192.168.180.134&lt;/code&gt;&amp;nbsp;为远程计算机的 IP 地址&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/tmp/kalacloud-data-export.sql&lt;/code&gt;&amp;nbsp;为需要下载到本地的数据库文件在远程计算机上的存储位置&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/Users/kalacloud/Downloads&lt;/code&gt;&amp;nbsp;为本地计算机的存储位置，远程文件将下载到这个目录中&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/6f0c7e812cb270b989d8ea684681745c/eb1d2/12-scp.png" title="" alt="使用 scp 下载文件到本地"&gt;&lt;/p&gt;

&lt;p&gt;使用&amp;nbsp;&lt;code&gt;scp&lt;/code&gt;&amp;nbsp;将导出的 SQL 文件下载到本地再进行后续处理。当然我们也可以一步导出至本地计算机，下面我们继续讲解进阶导出方法。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-allow-remote-access-to-mysql/" rel="nofollow" target="_blank" title=""&gt;如何远程连接 MySQL 数据库，阿里云腾讯云外网连接教程&lt;/a&gt;》&lt;/p&gt;
&lt;h3 id="2.进阶：将阿里云 / 腾讯云远程服务器中的数据库导出到本地计算机"&gt;2.进阶：将阿里云 / 腾讯云远程服务器中的数据库导出到本地计算机&lt;/h3&gt;
&lt;p&gt;前文我们讲了如何在远程服务器上操作导出数据库，导出后保存在远程服务器中。有时我们需要把数据导出给产品或运营进行数据分析，又或者我们使用的云服务是独立 MySQL 数据库，这时，你需要直接把数据导出到本地计算机中。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysqldump -h remote_IP_address  -u username -p -P3306 --default-character-set=utf8 --set-gtid-purged=OFF database_name &amp;gt;/Users/kalacloud/Desktop/data-dump.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;remote_IP_address&lt;/code&gt;&amp;nbsp;:远程服务器的 IP&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;username&lt;/code&gt;&amp;nbsp;：拥有远程登录权限的 MySQL 账号&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;3306&lt;/code&gt;：远程登录的数据库端口，默认是 3306，如果不是可根据情况替换&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;default-character-set=utf8&lt;/code&gt;&amp;nbsp;：导出时指定字符集&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;set-gtid-purged=OFF&lt;/code&gt;&amp;nbsp;：全局事务 ID (GTID) 来强化数据库的主备一致性，故障恢复，以及容错能力。开启这个功能导入导出时，可能会出错，故关闭。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;database_name&lt;/code&gt;&amp;nbsp;：需要导出的数据库名称&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/Users/kalacloud/Desktop/data-dump.sql&lt;/code&gt;&amp;nbsp;：本地计算机保存路径及保存文件名&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;提示：&lt;/strong&gt;&lt;code&gt;mysqldump&lt;/code&gt;常见报错：mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')&lt;/p&gt;

&lt;p&gt;可在命令中添加&amp;nbsp;&lt;code&gt;column-statistics=0&lt;/code&gt;&amp;nbsp;参数。因 MySQL 数据库早期版本&amp;nbsp;&lt;code&gt;information_schema&lt;/code&gt;&amp;nbsp;数据库中没有名为&amp;nbsp;&lt;code&gt;COLUMN_STATISTICS&lt;/code&gt;&amp;nbsp;的数据表，新版&amp;nbsp;&lt;code&gt;mysqldump&lt;/code&gt;&amp;nbsp;默认启用，我们可以通过此命令禁用它。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;导出实战 - 将阿里云服务器中的数据库直接导出到本地计算机&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysqldump -h123.57.56.228  -ukalacloud-remote -p -P3306 --default-character-set=utf8 --set-gtid-purged=OFF --column-statistics=0 kalacloud_database &amp;gt;/Users/kalacloud/Desktop/kalacloud-data-export.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;123.57.56.228&lt;/code&gt;：远程数据库 ip 地址&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;kalacloud-remote&lt;/code&gt;：拥有远程访问权限的数据库账号。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;-P 3306&lt;/code&gt;：数据库访问端口，可根据自己情况修改。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/Users/kalacloud/Desktop/kalacloud-data-export.sql&lt;/code&gt;&amp;nbsp;：本地计算机保存路径及保存文件名&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/aa178c898cfbd38cd0177ca1a9800710/a878e/03-aliyun-kalacloud-data-export.png" title="" alt="导出数据至本地计算机"&gt;&lt;/p&gt;

&lt;p&gt;执行命令后，命令行并没有任何信息输出，但我们已经可以在桌面上看到导出后生成的文件了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/dc743a333efd67df0f44f531ec237a06/2b013/04-desktop.jpg" title="" alt="在本地计算机查看服务器导出的文件"&gt;&lt;/p&gt;

&lt;p&gt;已经导出到本地桌面的远程端数据库&lt;/p&gt;

&lt;p&gt;当然，&lt;code&gt;mysqldump&lt;/code&gt;&amp;nbsp;也可以分表备份，比较常见的场景有&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 备份单个库
mysqldump -uroot -p -R -E --single-transactio --databases [database_one] &amp;gt; database_one.sql

# 备份部分表
mysqldump -uroot -p --single-transaction [database_one] [table_one] [table_two] &amp;gt; database_table12.sql

# 排除某些表
mysqldump -uroot -p [database_one] --ignore-table=[database_one.table_one] --ignore-table=[database_one.table_two] &amp;gt; database_one.sql

# 只备份结构
mysqldump -uroot -p [database_one] --no-data &amp;gt; [database_one.defs].sql

# 只备份数据
mysqldump -uroot -p [database_one] --no-create-info &amp;gt; [database_one.data].sql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扩展阅读：有关数据库在两台服务器之间迁移的问题可看我写的《&lt;a href="https://kalacloud.com/blog/how-to-migrate-a-mysql-database-between-two-servers-aliyun-tencentyun/" rel="nofollow" target="_blank" title=""&gt;如何迁移 MySQL 数据库，阿里云、腾讯云迁移案例&lt;/a&gt;》&lt;/p&gt;
&lt;h3 id="3.使用&amp;nbsp;into outfile&amp;nbsp;命令导出 MySQL / MariaDB 数据至 CSV / Excel"&gt;3.使用&amp;nbsp;&lt;code&gt;into outfile&lt;/code&gt;&amp;nbsp;命令导出 MySQL / MariaDB 数据至 CSV / Excel&lt;/h3&gt;
&lt;p&gt;有时我们需要将数据导出给运营或产品进行数据分析，这时导出 CSV 文件会更加方便使用。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; select * from users into outfile '/var/lib/mysql-files/users.csv' FIELDS TERMINATED BY ',';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;FIELDS TERMINATED BY ','&lt;/code&gt;&amp;nbsp;数据以 , 进行分隔。&lt;/p&gt;

&lt;p&gt;首先我们登录 MySQL shell，选择需要导出的数据库&lt;code&gt;use kalacloud_database;&lt;/code&gt;&amp;nbsp;然后执行导出命令。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/2cbee0a902e4c829cb7f1d98aa750542/b8471/05-use-kalacloud-database.png" title="" alt="使用 into outfile 导出数据"&gt;&lt;/p&gt;

&lt;p&gt;导出后会显示成功提示，&lt;code&gt;CD&lt;/code&gt;&amp;nbsp;到导出目录可看到 CSV 文件已导出。&lt;/p&gt;

&lt;p&gt;提示：&lt;code&gt;into outfile&lt;/code&gt;&amp;nbsp;常见报错&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是因为你的 MySQL 配置了&lt;code&gt;--secure-file-priv&lt;/code&gt;&amp;nbsp;限制了导出文件的存放位置。&lt;/p&gt;

&lt;p&gt;你可以使用以下命令来查看具体配置信息&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;show global variables like '%secure_file_priv%';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[&lt;img src="https://www.kalacloud.com/static/b122081289d2af49c9adaa964479b553/511f0/06-secure-file-priv.png" title="" alt="show global variables like '%secure_file_priv%'"&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;secure_file_priv&lt;/code&gt;&amp;nbsp;为 NULL 时，表示不允许导入或导出。&amp;nbsp;&lt;code&gt;secure_file_priv&lt;/code&gt;&amp;nbsp;为路径时（/var/lib/mysql-files/ ）时，表示只允许在路径目录中执行。&amp;nbsp;&lt;code&gt;secure_file_priv&lt;/code&gt;&amp;nbsp;没有值时，表示可在任意目录的导入导出。&lt;/p&gt;

&lt;p&gt;你可以打开 my.cnf 或 my.ini，添加以下语句，重启 MySQL server 即可&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;secure_file_priv=''
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扩展阅读：有关把 MySQL 查询出来的结果保存到文件可看我写的这篇《&lt;a href="https://kalacloud.com/blog/how-to-save-mysql-mariadb-query-output-to-a-file/" rel="nofollow" target="_blank" title=""&gt;如何在 MySQL 中保存查询结果到文件&lt;/a&gt;》教程。&lt;/p&gt;
&lt;h2 id="二. MySQL 或 MariaDB 数据库导入数据"&gt;二。MySQL 或 MariaDB 数据库导入数据&lt;/h2&gt;
&lt;p&gt;接着我们讲解如何将 *.sql 导入到数据库中。我们先建一个新数据库用作演示。&lt;/p&gt;

&lt;p&gt;我们以 root 或有足够权限的账号登录 MySQL：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysql -u root -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入登录密码后，进入 MySQL shell 状态。接着我们创建一个新数据库，在这个例子中，我们用&amp;nbsp;&lt;code&gt;kalacloud_new_database&lt;/code&gt;&amp;nbsp;作为新数据库名称。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; CREATE DATABASE kalacloud_new_database；
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行命令后返回内容&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query OK, 1 row affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用于演示的新数据库创建完成，我们使用&amp;nbsp;&lt;code&gt;CTRL+D&lt;/code&gt;&amp;nbsp;退出 MySQL shell&lt;/p&gt;
&lt;h3 id="1.直接使用&amp;nbsp;mysql&amp;nbsp;导入 SQL 文件"&gt;1.直接使用&amp;nbsp;&lt;code&gt;mysql&lt;/code&gt;&amp;nbsp;导入 SQL 文件&lt;/h3&gt;
&lt;p&gt;在命令行中我们导入上文导出的&amp;nbsp;&lt;code&gt;/tmp/kalacloud-data-export.sql&lt;/code&gt;&amp;nbsp;文件（注意：以下命令在&lt;strong&gt;命令行中执行&lt;/strong&gt;，不是在 mysql&amp;gt; 状态下执行）&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql -u root -p kalacloud_new_database &amp;lt; /tmp/kalacloud-data-export.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;root&lt;/code&gt;&amp;nbsp;：你可以登录数据库的用户名。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;kalacloud_new_database&lt;/code&gt;&amp;nbsp;：刚刚新建的空数据库，这条命令会把数据导入到这其中。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/tmp/kalacloud-data-export.sql&lt;/code&gt;&amp;nbsp;：是上文我们从数据库导出的 sql 文件，这里我们把它再导入到新数据库中。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果运行成功，命令行不会有任何提示。如果运行失败，命令行会提示失败原因。要检测是否导入成功，我们可以登录到 MySQL 查看并检查数据库中的数据。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/e25b61e1a7bd0c11d252beb51772dad5/79166/07-select.png" title="" alt="打开数据库中的表检查导入结果"&gt;&lt;/p&gt;

&lt;p&gt;登录 MySQL server，使用&amp;nbsp;&lt;code&gt;USE kalacloud_new_database;&lt;/code&gt;&amp;nbsp;选择刚刚我们导入数据的新建数据库，然后使用&lt;code&gt;SHOW TABLES;&lt;/code&gt;&amp;nbsp;查看数据库中包含的表，最后用&lt;code&gt;SELECT * FROM users;&lt;/code&gt;打开表查看内容。&lt;/p&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-edit-mysql-configuration-file-my-cnf-ini/" rel="nofollow" target="_blank" title=""&gt;MySQL 配置文件逐行解析&lt;/a&gt;》教程&lt;/p&gt;
&lt;h3 id="2.使用&amp;nbsp;source&amp;nbsp;导入 MySQL / MariaDB 数据库 SQL 文件"&gt;2.使用&amp;nbsp;&lt;code&gt;source&lt;/code&gt;&amp;nbsp;导入 MySQL / MariaDB 数据库 SQL 文件&lt;/h3&gt;
&lt;p&gt;进入 MySQL shell 状态，我们还是导入本教程前文导出的&amp;nbsp;&lt;code&gt;/tmp/kalacloud-data-export.sql&lt;/code&gt;&amp;nbsp;文件，到新数据库中。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; USE kalacloud_new_database;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先选择需要导入的数据库&lt;code&gt;kalacloud_new_database&lt;/code&gt;，返回结果。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database changed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后使用 source&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; source /tmp/kalacloud_new_database.sql;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/47c27f60effa0d35d40c369e5ac30c67/d7ceb/10-source.png" title="" alt="使用 source 导入数据"&gt;&lt;/p&gt;

&lt;p&gt;执行&amp;nbsp;&lt;code&gt;source&lt;/code&gt;&amp;nbsp;命令后，MySQL 开始执行导入，接着我们使用&amp;nbsp;&lt;code&gt;SHOW TABLES&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code&gt;select&lt;/code&gt;&amp;nbsp;来查看 SQL 文件是否导入正常。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/fbdb9f9d4addc37d41e236771b206364/79166/11-source-show-table.png" title="" alt="检查 source 命令是否导入成功"&gt;&lt;/p&gt;

&lt;p&gt;上图可以看到，数据已经导入成功。&lt;/p&gt;

&lt;p&gt;特别提示：&lt;code&gt;source&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code&gt;mysql &amp;lt;&lt;/code&gt;&amp;nbsp;两种导入方式的区别&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;命令执行环境不同：&lt;/strong&gt;&lt;code&gt;source&lt;/code&gt;&amp;nbsp;在 MySQL sell 里执行，&lt;code&gt;mysql &amp;lt;&lt;/code&gt;&amp;nbsp;在终端命令行中执行&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;返回结果的不同：&lt;/strong&gt;&lt;code&gt;source&lt;/code&gt;&amp;nbsp;会连续返回每一行导入结果，如果量大可能会影响速度，&lt;code&gt;mysql &amp;lt;&lt;/code&gt;&amp;nbsp;全部完成后返回结果。&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;报错是否停止执行：&lt;/strong&gt;&lt;code&gt;source&lt;/code&gt;&amp;nbsp;遇到报错不会终止执行，&lt;code&gt;mysql &amp;lt;&lt;/code&gt;&amp;nbsp;遇到报错会终止执行。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;扩展阅读：《&lt;a href="https://kalacloud.com/blog/how-to-manage-and-use-mysql-database-triggers/" rel="nofollow" target="_blank" title=""&gt;MySQL 触发器六种情况一次讲透，应用实战案例&lt;/a&gt;》&lt;/p&gt;
&lt;h3 id="3.MySQL / MariaDB 数据库中导入 CSV 文件"&gt;3.MySQL / MariaDB 数据库中导入 CSV 文件&lt;/h3&gt;
&lt;p&gt;除了直接导入 sql 类文件外，有时候我们还会碰到需要导入 CSV 文件。导入 CSV 文件的步骤与直接导入 sql 有很大的不同，接着我们来讲解如何导入 CSV 文件。&lt;/p&gt;

&lt;p&gt;我们先进入 MySQL Shell：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysql -uroot -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后新建一个空数据库：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; CREATE DATABASE kalacloud_new_database;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与导入 *.sql 不同，导入 CSV 文件需要先创建「表」，我们需要根据 CSV 文件中包含的列，使用&lt;code&gt;CREATE TABLE&lt;/code&gt;&amp;nbsp;创建表。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE `users` (
  `id` VARCHAR(255) NULL,
  `name` VARCHAR(255) NULL,
  `phone` VARCHAR(255) NULL,
  `states` VARCHAR(255) NULL,
  `file_size` VARCHAR(255) NULL,
  `sale` VARCHAR(255) NULL,
  `copyright` VARCHAR(255) NULL,
  `homepage` VARCHAR(255),
  `complaint` VARCHAR(255) NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建议所有字段都设为接纳&amp;nbsp;&lt;code&gt;NULL&lt;/code&gt;&amp;nbsp;值，也暂时不要设置主键。因为我们并不知道即将导入的 CSV 文件中的数据是否完整和规范。&lt;/p&gt;

&lt;p&gt;建议即便是数字，也先使用&lt;code&gt;VARCHAR&lt;/code&gt;字段，以防止文件中的数据格式不正确导致的奇怪错误。&lt;/p&gt;

&lt;p&gt;我们可以在数据导入后，在对数据库进行验证、清理和修正。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/d3246777ab4a78e4be20e807f751a6cd/b5a09/08-create-excel.png" title="" alt="使用 excel 导入数据.png"&gt;&lt;/p&gt;

&lt;p&gt;上文中我们从&amp;nbsp;&lt;code&gt;kalacloud_database&lt;/code&gt;&amp;nbsp;中导出了表&amp;nbsp;&lt;code&gt;users&lt;/code&gt;&amp;nbsp;存放到了&lt;code&gt;/var/lib/mysql-files/users.csv&lt;/code&gt;&amp;nbsp;里，下面我们使用&amp;nbsp;&lt;code&gt;LOAD DATA INFILE SQL&lt;/code&gt;&amp;nbsp;语句把这个 CSV 文件导入新建的表中。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;load data infile '/var/lib/mysql-files/users.csv'
into table users
FIELDS TERMINATED BY ','
ENCLOSED BY '"';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;字段使用逗号分隔，字符串用双引号括起来。如果你的 CSV 第一行是标题而非数据，那么还可以添加&amp;nbsp;&lt;code&gt;IGNORE 1 ROWS;&lt;/code&gt;&amp;nbsp;导入时，忽略第一行。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/530d230f067b4dff0257f8d853616a75/a8979/09-users-csv.png" title="" alt="使用 csv 导入数据"&gt;&lt;/p&gt;

&lt;p&gt;导入成功后，使用&amp;nbsp;&lt;code&gt;select * from users;&lt;/code&gt;&amp;nbsp;初步检查表中数据是否正确。&lt;/p&gt;

&lt;p&gt;扩展阅读：我们也可以使用 Workbench 这种免费的 MySQL 图形管理工具来操作，了解更多可看我写的这篇《&lt;a href="https://kalacloud.com/blog/mysql-workbench-tutorial/" rel="nofollow" target="_blank" title=""&gt;MySQL Workbench 中文指南&lt;/a&gt;》教程。&lt;/p&gt;
&lt;h2 id="三. 使用「卡拉云」一键导入导出数据"&gt;三。使用「卡拉云」一键导入导出数据&lt;/h2&gt;
&lt;p&gt;除了&lt;a href="https://kalacloud.com/blog/how-to-connect-to-a-mysql-server-remotely-with-mysql-workbench/" rel="nofollow" target="_blank" title=""&gt;MySQL / MariaDB 数据迁移&lt;/a&gt;这类适合使用终端命令操作外，大多数对 MySQL / MariaDB 数据导入导出操作还是为了数据展示、分析、协同共享等产品和运营层面的应用场景。&lt;/p&gt;

&lt;p&gt;比如后端工程师接到产品需求，协助导出某类数据等场景，如果这类需求频繁出现，推荐使用卡拉云，卡拉云是新一代低代码开发工具，免安装部署，可一键接入包括 MySQL 在内的常见数据库及 API。&lt;/p&gt;

&lt;p&gt;不仅可以像命令行一样灵活，还可根据自己的工作流，定制开发。无需繁琐的前端开发，只需要简单拖拽，即可快速搭建企业内部工具。&lt;strong&gt;数月的开发工作量，使用卡拉云后可缩减至数天，欢迎试用我们开发的&lt;a href="https://kalacloud.com/?utm_medium=register" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/f98d898ab39be0bac391c36484bd77c8/71c1d/15-sql-all.png" title="" alt="卡拉云可快速接入常见的数据库及API"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可快速接入的常见数据库及 API&lt;/p&gt;

&lt;p&gt;卡拉云可根据公司工作流需求，轻松搭建数据看板，并且可分享给组内的小伙伴共享数据&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/5400a60956e16d655e0297c5d6e5a8d2/14-kalacloud-gif.gif" title="" alt="卡拉云仅需拖拽即可快速生成前端组件"&gt;&lt;/p&gt;

&lt;p&gt;仅需拖拽一键生成前端代码，简单一行代码即可映射数据到指定组件中。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/f5669b9993d738a2c3b4d4a72419ae85/d3e24/13-kalacloud-list.jpg" title="" alt="卡拉云可轻松导出各类数据格式"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云可直接添加导出按钮，导出适用于各类分析软件的数据格式，方便快捷。&lt;a href="https://kalacloud.com/?utm_medium=register" rel="nofollow" target="_blank" title=""&gt;立即开通卡拉云&lt;/a&gt;，导入导出你的数据&lt;/p&gt;
&lt;h2 id="四.总结"&gt;四。总结&lt;/h2&gt;
&lt;p&gt;在本教程中，我们讲解了如何导入导出数据库至 SQL 文件和 CSV 文件。mysqldump 还有很多使用变化，你可以参考 mysqldump&amp;nbsp;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html" rel="nofollow" target="_blank" title=""&gt;官方文档&lt;/a&gt;了解更多。更多数据库相关教程可访问&amp;nbsp;&lt;a href="https://kalacloud.com/" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;&amp;nbsp;查看。&lt;/p&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Wed, 10 Nov 2021 16:57:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/41870</link>
      <guid>https://ruby-china.org/topics/41870</guid>
    </item>
    <item>
      <title>最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选？</title>
      <description>&lt;p&gt;&lt;img src="https://kalacloud.com/static/fe660970c5629a53f78c282c548da1d4/ef245/head.jpg" title="最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选?" alt="最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选?"&gt;
因为工作的原因，我有机会仔细用过市面上几乎所有的 MySQL 管理工具，对各家的数据库管理软件的特性有了全面的了解。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/35a47c725b97567cdb7c665fc3cb04b7/be77b/00-icon-win.jpg" title="Windows 下的 MySQL 管理软件" alt="Windows 下的 MySQL 管理软件"&gt;&lt;/p&gt;

&lt;p&gt;我大概用了 20+ 款 MySQL 管理工具，从种挑出 10 款最棒的写了今天的测评。其中 7 款免费或有社区免费版，另外 3 种是付费版。&lt;/p&gt;

&lt;p&gt;当初，在研究这些工具时，我发现网上那些所谓的测评推荐文章里，几乎没人真用过自己文章中写的软件，都是云测评。&lt;/p&gt;

&lt;p&gt;当时就想自己把所有软件都用一遍，找机会写一篇深度横向测评文章，帮助选择困难症患者，选到最合适大家当下工作场景的工具，节省时间。
本文所写软件，我都用过。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/1bb325a717e64f658ac15edf514dc3b1/ef245/00-icon-mac.jpg" title="Mac 下的 MySQL 管理软件" alt="Mac 下的 MySQL 管理软件"&gt;
Mac 下的 MySQL 管理软件&lt;/p&gt;
&lt;h3 id="最好用的 10 款 MySQL 管理工具测评概览"&gt;最好用的 10 款 MySQL 管理工具测评概览&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; MySQL Workbench - 免费、官方、有付费软件才有的重型功能&lt;/li&gt;
&lt;li&gt; Sequel Pro - 免费、小巧、轻量级、Mac Only&lt;/li&gt;
&lt;li&gt; Beekeeper Studio - 免费、小巧、跨平台、多数据库支持&lt;/li&gt;
&lt;li&gt; HeidiSQL - 免费 Win Linux only 功能丰富直给 有中文版&lt;/li&gt;
&lt;li&gt; DBeaver - 免费 小巧、跨平台、功能大合集式，多数据库 有中文版&lt;/li&gt;
&lt;li&gt; phpMyadmin - 免费、跨平台在线版、简单直接，上手快&lt;/li&gt;
&lt;li&gt; 卡拉云 - 免费、无需安装 跨平台 多数据库支持 灵活搭建 定制开发 新一代&lt;/li&gt;
&lt;li&gt; Navicat - 付费、跨平台、稳定、重型功能、有中文版&lt;/li&gt;
&lt;li&gt; dbForge Studio - 付费 Win only 稳定 产品逻辑扎实&lt;/li&gt;
&lt;li&gt;SQLyog - 付费 Win Only 付费中的精巧版 中文版&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;以上这 10 款是我从市面上 20+ 款中精简出来的，它们再也不能精简了，属于各有各的特色。&lt;/p&gt;
&lt;h3 id="我写的全面测评文章非常长，还有大量测试截图，转载非常麻烦，这里只是摘要。"&gt;我写的全面测评文章非常长，还有大量测试截图，转载非常麻烦，这里只是摘要。&lt;/h3&gt;&lt;h3 id="请点这查看《 最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选?》完整版，以下是摘要。"&gt;请点这查看《 &lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/" rel="nofollow" target="_blank" title=""&gt;最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选？&lt;/a&gt;》完整版，以下是摘要。&lt;/h3&gt;&lt;h2 id="HeidiSQL  - 免费 Win Linux only 功能直给 中文版"&gt;
&lt;a href="https://www.heidisql.com/" rel="nofollow" target="_blank" title=""&gt;HeidiSQL&lt;/a&gt;  - 免费 Win Linux only 功能直给 中文版&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/d72b6ea35559d78d215b6e280f7e46f3/e5166/04-1-HeidiSQL.jpg" title="HeidiSQL 主界面" alt="HeidiSQL 主界面"&gt;&lt;/p&gt;

&lt;p&gt;HeidiSQL 的界面太 2000 年了，绿色版（无需安装版）的免费软件的调调，把所有的功能都摊在界面上，直给的感觉。它有一个很大的状态栏，把所有 SQL 运行过程全都展现在这里面，你或它自动帮你执行的所有动作，都是如此的直接。&lt;/p&gt;

&lt;p&gt;HeidiSQL 用起来很像 dbForge 和 SQLyog 的无产品经理版，一切都是如此的程序员。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/128bb3b0e2bcd6bb07b79b7d3dec3a88/e5166/04-2-HeidiSQL-mysql.jpg" title="HeidiSQL 支持多种数据库" alt="HeidiSQL 支持多种数据库"&gt;&lt;/p&gt;

&lt;p&gt;HeidiSQL 相对于 Beekeeper 和 Sequel Pro 来说功能要多一些，HeidiSQL 更像是一个 MySQL 管理工具，而 Beekeeper 和 Sequel Pro 更像是轻巧的简单维护工具。&lt;/p&gt;

&lt;p&gt;还有一个大家挺关心的，介绍道这里终于出现了支持中文的 MySQL 管理软件，如果你对中文很在意，可以试试 HeidiSQL 和接下来我要介绍的 DBeaver&lt;/p&gt;
&lt;h2 id="卡拉云  - 无需安装 跨平台 多数据库支持 灵活搭建 定制开发"&gt;
&lt;a href="https://kalacloud.com/" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;  - 无需安装 跨平台 多数据库支持 灵活搭建 定制开发&lt;/h2&gt;
&lt;p&gt;新一代数据库工作流搭建神器 —— 卡拉云。我们操作数据库实际上就是根据应用场景对数据库进行 CRUD，卡拉云在这个基础上，可以帮你定制你的前端操作界面，使常用的读写数据库场景工具化。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/262f747af78a6378e3b77e271df93056/07-1--gif-kalacloud-stock.gif" title="" alt="使用卡拉云快速搭建数据看板"&gt;&lt;/p&gt;

&lt;p&gt;你只要会写 SQL，不用会前端，仅需简单拖拽，即可快速生成前端组件，并将对应的数据映射到组件上，快速搭建属于自己的数据库工具。比如上面的动图，拖拽表格组件到画布上，然后将数据库中的交易数据列表映射到表格中，1 秒变数据看板，卡拉云帮你写好 filter（红框部分） ，直接 filter 表格中的数据。&lt;/p&gt;

&lt;p&gt;卡拉云还帮你整合好了所有常用功能，比如数据导出，翻页，图表展示、交互按钮等。再也不怕组内同学问你要数据，你被迫变成取数机，天天干复制粘贴的杂活。现在直接用卡拉云 5 分钟搭一套工具，丢链接给需要的同学就行了（你有权限控制权）。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/18822b2a23183deb7d11dd484a7f65aa/c1b63/07-2-kalacloud-sql.png" title="卡拉云支持多种数据库接入" alt="卡拉云支持多种数据库接入"&gt;&lt;/p&gt;

&lt;p&gt;卡拉云不仅支持市面上常见的数据库，而且还支持常用的 API 接入。
你可以用它来组件你自己的工具。比如写一组自动生成字符串的 SQL 变成一套「&lt;a href="https://kalacloud.com/blog/coupon-system-design/" rel="nofollow" target="_blank" title=""&gt;优惠券发放核销系统&lt;/a&gt;」
或者接入支付宝、微信支付 API，做一套「&lt;a href="https://kalacloud.com/blog/wechat-alipay-reconciliation-solution/" rel="nofollow" target="_blank" title=""&gt;对账系统&lt;/a&gt;」
接入「金数据」做一套「&lt;a href="https://kalacloud.com/blog/users-review/" rel="nofollow" target="_blank" title=""&gt;用户审核系统&lt;/a&gt;」
甚至接入「人脸识别、身份证校验 API」快速搭建一套「&lt;a href="https://kalacloud.com/blog/driver-Identity-verification-checks/" rel="nofollow" target="_blank" title=""&gt;网约车司机身份审核系统&lt;/a&gt;」等。&lt;/p&gt;

&lt;p&gt;不用担心自己不会前端，只要会写 SQL 就行，你的任何操作数据库的需求都可以用卡拉云实现，来试试 5 分钟搭一套属于你的日常数据库工具吧。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;by the way 我是卡拉云的开发者之一，欢迎一起交流。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;接下来说说付费 MySQL 管理软件，到底付费与免费的区别在什么地方？&lt;/p&gt;
&lt;h2 id="Navicat for MySQL  付费、跨平台、中文、稳定"&gt;
&lt;a href="https://www.navicat.com/en/products/navicat-for-mysql" rel="nofollow" target="_blank" title=""&gt;Navicat for MySQL&lt;/a&gt;  付费、跨平台、中文、稳定&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://kalacloud.com/static/ab190968cc69f94b6caf3da568e93424/e5166/08-1-navicat.jpg" title="navicat 主界面" alt="navicat 主界面"&gt;&lt;/p&gt;

&lt;p&gt;Navicat 可以说是付费软件中的霸主，之所以它能有这样的占有率，完全是因为在数据库管理软中使用的所有功能，它做到了极致。仔细看上图 Navicat 的一级菜单上的功能排布，条理清晰到挑不出错。&lt;/p&gt;

&lt;p&gt;付费软件最核心的特点是稳定，体现这种稳定，其中一个点就是对大型 SQL 查询的稳定运行。上文介绍的所有安装在本地的免费软件，卡顿，闪退，假死时不常会碰到，但付费软件能做到几乎不出错，这也是付费的意义。&lt;/p&gt;

&lt;p&gt;而 Navicat 在稳定的基础上，又把所有功能做到付费软件中无人能敌的精细。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/62a98e3680c9c425bf066c9354272eaf/4ef49/08-2-navicat-NewDataTransfer.png" title="navicat 大型数据传输" alt="navicat 大型数据传输"&gt;&lt;/p&gt;

&lt;p&gt;大数据传输，Navicat 能更稳定和快速的传输大型数据，并且保持稳定。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://kalacloud.com/static/381f192d4bf5e8fdf0575d97b1ad3fe0/c1b63/08-3-navicat-DataModellingTools.png" title="navicat-DataModellingTools" alt="navicat-DataModellingTools"&gt;&lt;/p&gt;

&lt;p&gt;Navicat 的 ER 模型搭建。并不是简单的制作 ER 模型，而是在本地画好了，配置好了，可以一键同步到云端数据库。&lt;/p&gt;
&lt;h3 id="以上仅简单转了 3 款摘要，我一共横向测评了 10 款 MySQL 数据库管理软件，实打实的下载使用后再写的测评。"&gt;以上仅简单转了 3 款摘要，我一共横向测评了 10 款 MySQL 数据库管理软件，实打实的下载使用后再写的测评。&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;  到底付费版比免费版好在什么地方？&lt;/li&gt;
&lt;li&gt;  付费版就一定臃肿吗？有没有稳定有精巧的付费版数据库管理软件？&lt;/li&gt;
&lt;li&gt;  为什么大多数人的工作场景，免费版就够了？&lt;/li&gt;
&lt;li&gt;  什么样的工作情况，需要上付费版了呢？&lt;/li&gt;
&lt;li&gt;  什么样的大型功能是付费有免费没有的呢？&lt;/li&gt;
&lt;li&gt;  ......&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="以上这些问题都可以在我的测评文章中找到答案。请点这里查看，我写的《MySQL 管理工具横向测评》完整版 最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选?"&gt;以上这些问题都可以在我的测评文章中找到答案。请点这里查看，我写的《MySQL 管理工具横向测评》完整版 &lt;a href="https://kalacloud.com/blog/best-mysql-gui-tools/" rel="nofollow" target="_blank" title="最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选?"&gt;最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选？&lt;/a&gt;
&lt;/h3&gt;
&lt;hr&gt;
&lt;h3 id="评论区说一下你自己的选择、为什么这么选"&gt;评论区说一下你自己的选择、为什么这么选&lt;/h3&gt;&lt;h3 id="快救救选择困难的同学。"&gt;快救救选择困难的同学。&lt;/h3&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Wed, 03 Nov 2021 13:30:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/41843</link>
      <guid>https://ruby-china.org/topics/41843</guid>
    </item>
    <item>
      <title>我们开发了一套面向后端程序员的生产力工具，正在内测中，欢迎试用</title>
      <description>&lt;p&gt;各位好，我和朋友开发了一套面向后端程序员的生产力工具 —— &lt;a href="http://kalacloud.com/?utm_source=rubychina&amp;amp;utm_medium=p06" rel="nofollow" target="_blank" title=""&gt;卡拉云&lt;/a&gt;，帮助后端程序员快速搭建企业内部后台的工具。&lt;/p&gt;

&lt;p&gt;目前已经上线，正在内测中，第一批种子用户反馈还不错，也很想听听大家的意见。&lt;/p&gt;
&lt;h3 id="一、我们解决的问题"&gt;一、我们解决的问题&lt;/h3&gt;
&lt;p&gt;将多数据源组合在一起，快速搭建一套企业内部后台。数周的工作量降低至几天，极大的提升开发效率。
1.快速接入 API
2.快速接入 常见的数据库
3.前端组件拖放、与数据源轻松连接&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/HiJiangChuan/76e20430-4975-4741-a9e3-37594ced25bd.png!large" title="" alt="卡拉云可快速接入常见的api与数据库"&gt;&lt;/p&gt;
&lt;h3 id="二、使用场景"&gt;二、使用场景&lt;/h3&gt;
&lt;p&gt;多数据源融合，前端展现编辑处理，返回数据源。&lt;/p&gt;

&lt;p&gt;1.案例一：
一家社区类 app，社区中高级用户需要认证自己的账号，认证账号填写一份申请资料表。
之后社区运营会根据这张表判断是否符合认证需求。最后在数据库中修改该用户对应账号的状态。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/HiJiangChuan/87eb3a77-83e7-4526-b6e3-a635fec43925.gif!large" title="" alt="面包多搭建动图.gif"&gt;&lt;/p&gt;

&lt;p&gt;数据源：&lt;/p&gt;

&lt;p&gt;（1）用户填写账号认证申请表 -&amp;gt; 金数据 API&lt;/p&gt;

&lt;p&gt;（2）运营人员审核用户并更改用户状态 -&amp;gt; 自己的数据库&lt;/p&gt;

&lt;p&gt;&lt;img src="https://duckfiles.oss-cn-qingdao.aliyuncs.com/eleduck/image/f8c7900d-08f1-4ad9-90f0-35d267fa25d9.png" title="" alt="卡拉云搭建的认证后台"&gt;&lt;/p&gt;

&lt;p&gt;运营前端操作：&lt;/p&gt;

&lt;p&gt;（1）根据用户填写的金数据表格数据、社区数据库中用户详情，判断是否给予认证&lt;/p&gt;

&lt;p&gt;（2）根据规则等级，修改认证用户的账号权限&lt;/p&gt;

&lt;p&gt;（3）将修改后的数据提交至数据库中&lt;/p&gt;

&lt;p&gt;我在 B 站做了个讲解视频，录的不太好，还请见谅 -&amp;gt; &lt;a href="https://www.bilibili.com/video/BV1mV411s7Fv/" rel="nofollow" target="_blank" title=""&gt;如何使用卡拉云快速搭建用户认证审核系统&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.其他案例：&lt;/p&gt;

&lt;p&gt;（1）某地方网约车公司，使用卡拉云搭建「用户端、司机端钱包余额审核退款后台」&lt;/p&gt;

&lt;p&gt;（2）某地方网约车公司，使用卡拉云搭建「司机端人脸、身份证、驾照审核认证后台」&lt;/p&gt;

&lt;p&gt;（3）某地产企业，使用卡拉云，搭建「小程序内容上传后台」&lt;/p&gt;

&lt;p&gt;（4）某活动公司，使用卡拉云，搭建「电子票核销后台」&lt;/p&gt;

&lt;p&gt;（5）某电商公司，使用卡拉云，搭建「线上优惠券发放核销后台」&lt;/p&gt;

&lt;p&gt;（6）某在线教育，使用卡拉云，搭建「支付宝微信财务对账后台」&lt;/p&gt;

&lt;p&gt;（7）某法务公司，使用卡拉云，搭建「合同审核管理后台」&lt;/p&gt;
&lt;h3 id="三、我们正在寻找种子用户"&gt;三、我们正在寻找种子用户&lt;/h3&gt;
&lt;p&gt;我们团队一共两个人，人手不够也并不太擅长做市场。还请大家多多帮助。&lt;/p&gt;

&lt;p&gt;我们已经帮助非常多轻后端的创业公司解决了后台开发效率的问题，如果您的工作中也有类似后台搭建的场景话，欢迎来试试我们的卡拉云。&lt;/p&gt;
&lt;h2 id="【【【目前我们还没有开放注册，请加我微信 HiJiangChuan ，我来给您开账号。】】】"&gt;【【【目前我们还没有开放注册，请加我微信 HiJiangChuan，我来给您开账号。】】】&lt;/h2&gt;</description>
      <author>HiJiangChuan</author>
      <pubDate>Wed, 18 Aug 2021 15:30:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/41591</link>
      <guid>https://ruby-china.org/topics/41591</guid>
    </item>
  </channel>
</rss>
