简介
MySQL 在表和数据库中管理其数据。表在预定义的列和数据类型模式中存储数据。数据库是一种可以容纳多个表、索引、过程的结构,并有助于定义权限、自定义等的范围。
在本指南中,我们将向您展示如何在 MySQL 中创建表和数据库。我们将展示如何管理这两种结构的一些功能,然后我们将介绍如何在不再需要它们时将其删除以进行清理。
先决条件
要遵循本指南,您需要使用具有管理权限的用户通过 mysql
命令行客户端登录到 MySQL 服务器。
如果您不想使用 root
MySQL 管理账户登录,您的用户至少需要 CREATE
权限才能执行本指南中描述的操作。
您可以输入以下命令来检查用户的可用权限:
SHOW GRANTS\G
如何创建新数据库?
我们将首先演示如何创建一个新的数据库。在 MySQL 中,数据库包含表、索引、存储过程以及通常与单个项目相关的其他资源。这些资源都必须在数据库中创建,因此学习如何创建新数据库是一个很好的第一步。
创建新数据库的基本语法如下:
CREATE DATABASE <db_name>;
执行命令前,请将 <db_name>
替换为您希望为数据库指定的名称。此命令将创建具有给定名称的数据库,并将当前用户设置为新数据库的所有者。
数据库将使用系统范围内的字符集、排序规则和加密属性的默认值:
- CHARACTER SET(字符集):设置新数据库的字符集。这是一个本地化选项,影响哪些字符被视为大写、小写和数字。
- COLLATE(排序规则):设置数据库的排序规则。这是一个本地化选项,决定了项目在排序时的组织方式。
- ENCRYPTION(加密):设置新数据库的加密。这是一个布尔选项,可以是 'Y' 表示是,'N' 表示否。
您可以通过输入以下命令找到您安装中可用的字符集:
SHOW CHARACTER SET;
同样,您可以通过输入以下命令找到可用的排序规则:
SHOW COLLATION;
如果您想为其中一个参数指定非默认值,可以在主创建语句后添加它们,如下所示:
CREATE DATABASE <db_name>CHARACTER SET = 'utf8mb4'COLLATE = 'utf8mb4_0900_ai_ci'ENCRYPTION = 'Y';
为了配合本指南中的示例,请使用实例的默认区域设置和 UTF8 字符集创建一个名为 school
的数据库。
CREATE DATABASE school CHARACTER SET = 'utf8mb4';
这将根据您提供的规范创建新数据库。
列出现有数据库
要列出服务器上可用的数据库,请键入:
SHOW DATABASES;
这将列出环境中当前定义的每个数据库。
+--------------------+Database |+--------------------+information_schema |mysql |performance_schema |school |sys |testing |+--------------------+6 rows in set (0.00 sec)
您可以使用 SHOW CREATE DATABASE
命令验证您提供的设置是否已应用于新的 school
数据库。
SHOW CREATE DATABASE school;
输出将显示用于创建数据库的命令和选项,并用应用的默认值填充选项。
+----------+----------------------------------------------------------------------------------------------------------------------------------+Database | Create Database |+----------+----------------------------------------------------------------------------------------------------------------------------------+school | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |+----------+----------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)
如何在 MySQL 中切换到不同数据库
数据库创建后,您可以通过几种不同的方式使用它。
第一种选择是在您使用的每个命令中将数据库指定为参数。但是,如果您正在运行多个与数据库对象相关的命令,为了节省时间,您也可以“切换到”或“使用”该数据库,以将您的新数据库设置为将要运行的任何数据库相关命令的默认上下文。
要切换到不同的数据库,请键入:
USE <db_name>;
在本例中,我们可以通过键入以下命令切换到我们创建的 school
数据库:
USE school;
在数据库中创建表
创建数据库后,您可以在其中定义表和其他对象来存储和管理数据。在 MySQL 中,表由表名、列定义(这些又包括名称、数据类型和约束等)以及表选项组成。
MySQL 的 CREATE TABLE
命令语法是什么?
使用 MySQL 的 CREATE TABLE
命令创建表的基本语法如下所示:
CREATE TABLE <table_name> (<column_name> <data_type> [<column_constraint>],[<table_constraint>,]);
我们可以将上述命令模板分解为以下几个部分:
CREATE TABLE <table_name>
:基本创建语句。<table_name>
占位符应替换为您希望使用的表名。<column_name> <data_type>
:定义表中的基本列。<column_name>
占位符应替换为您希望用于列的名称。<data_type>
指定列的 MySQL 数据类型。存储在表中的数据必须符合列结构和列数据类型才能被接受。<column_constraint>
:列约束是可选的限制,为数据添加额外的要求。例如,您可以要求条目不能为 null、唯一或正整数。<table_constraint>
:表约束类似于列约束,但涉及多列的交互。例如,您可以有一个表约束,检查表中的DATE_OF_BIRTH
是否在DATE_OF_DEATH
之前。
如何仅在表不存在时创建表?
MySQL 的默认行为是,如果您尝试创建已存在的表,则会引发错误。但是,可以在创建语句中添加可选的 IF NOT EXISTS
子句来覆盖此行为。
您可以通过在 CREATE TABLE
短语之后但在表名之前插入 IF NOT EXISTS
子句来使用它。
CREATE TABLE IF NOT EXISTS table_name (column_name TYPE [column_constraint],[table_constraint,]);
这将修改命令的行为如下:如果指定的表名已存在,MySQL 将发出警告而不是错误。命令的其余行为保持不变。
在 MySQL 数据库中创建表
上面给出的命令模板足以创建基本表。为了进一步阐述我们的示例,我们将在 school
数据库中创建两个表。一个表名为 supplies
,另一个表名为 teachers
。
在 supplies
表中,我们将包含以下字段:
- id:每种学校用品的唯一 ID。
- name:特定学校物品的名称。
- description:物品的简短描述。
- manufacturer:物品制造商的名称。
- color:物品的颜色。
- inventory:我们拥有的某种学校用品的数量。此数量不得小于 0。
我们可以使用以下 SQL 语句创建具有上述属性的 supplies
表:
CREATE TABLE supplies (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255),description VARCHAR(255),manufacturer VARCHAR(255),color VARCHAR(255),inventory INT CHECK (inventory >= 0));
这将在 school
数据库中创建 supplies
表。PRIMARY KEY
列约束是一种特殊的约束,用于指示可以唯一标识表中记录的列。因此,该约束指定该列不能为 null 并且必须唯一。MySQL 为主键列创建索引以提高查询速度。
通过键入以下命令验证新表是否存在:
SHOW TABLES;
+------------------+Tables_in_school |+------------------+supplies |+------------------+1 row in set (0.01 sec)
您可以通过键入以下命令验证模式是否反映了您的定义:
SHOW CREATE TABLE supplies\G
*************************** 1. row ***************************Table: suppliesCreate Table: CREATE TABLE `supplies` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`description` varchar(255) DEFAULT NULL,`manufacturer` varchar(255) DEFAULT NULL,`color` varchar(255) DEFAULT NULL,`inventory` int DEFAULT NULL,PRIMARY KEY (`id`),CONSTRAINT `supplies_chk_1` CHECK ((`inventory` >= 0))) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec
我们指定的列、数据类型和约束都存在于输出中,尽管顺序和显示方式可能不同。
接下来,创建一个 teachers
表。此表中应包含以下列:
- id:唯一的员工识别号。
- first_name:教师的名字。
- last_name:教师的姓氏。
- subject:教师受聘教授的科目。
- grade_level:教师受聘教授的学生年级。
使用以下 SQL 语句创建具有上述模式的 teachers
表:
CREATE TABLE teachers (id INT AUTO_INCREMENT PRIMARY KEY,first_name VARCHAR(255),last_name VARCHAR(255),subject VARCHAR(255),grade_level INT);
如何创建带有主键和外键的表
您可以在我们的其他 MySQL 指南中找到有关创建带有主键和外键的表的信息。主键和外键都是 MySQL 中的数据库约束类型。
主键是特殊的列或列,它保证在同一表中的行之间是唯一的。所有主键都可以用于唯一标识特定行。主键不仅确保每行对于主键列都有一个唯一值,还确保这些列不包含 NULL
值。通常,MySQL 中的主键使用以下格式来指定自动递增的主键:id INT AUTO_INCREMENT PRIMARY KEY
。
外键是一种确保一个表中的一个或多个列与另一个表中所包含的值匹配的方式。这有助于确保表之间的引用完整性。
如何在 MySQL 中查看表
在 MySQL 中,您可以根据要查找的信息以几种不同的方式列出表。
如果您想查看数据库中有哪些表可用,请键入:
SHOW TABLES;
+------------------+Tables_in_school |+------------------+supplies |teachers |+------------------+2 rows in set (0.00 sec)
您还可以检查表的模式是否符合您的规范。
DESCRIBE teachers;
+--------------+--------------+------+-----+---------+----------------+Field | Type | Null | Key | Default | Extra |+--------------+--------------+------+-----+---------+----------------+id | int | NO | PRI | NULL | auto_increment |name | varchar(255) | YES | | NULL | |description | varchar(255) | YES | | NULL | |manufacturer | varchar(255) | YES | | NULL | |color | varchar(255) | YES | | NULL | |inventory | int | YES | | NULL | |+--------------+--------------+------+-----+---------+----------------+6 rows in set (0.00 sec)
teachers
表似乎与我们的定义匹配。
如何使用 ALTER TABLE
命令更改表
如果您需要在 MySQL 中更改现有表的模式,可以使用 ALTER TABLE
命令。ALTER TABLE
命令与 CREATE TABLE
命令非常相似,但它作用于现有表。
修改表语法
在 MySQL 中修改表的基本语法如下:
ALTER TABLE <table_name> <change_command> <change_parameters>;
<change_command>
指示您希望进行的具体更改类型,无论是设置表上的不同选项、添加或删除列,还是更改类型或约束。<change_parameters>
命令部分包含 MySQL 完成更改所需的任何额外信息。
向表中添加列
您可以使用 ADD
更改命令向 MySQL 表中添加列。更改参数将包括列名、类型和选项,就像您在 CREATE TABLE
命令中指定它们一样。
例如,要向名为 some_table
的表中添加一个名为 missing_column
且类型为 text
的列,您可以键入:
ALTER TABLE some_table ADD missing_column text;
从表中删除列
相反,如果您想删除现有列,可以使用 DROP COLUMN
命令。您需要将要删除的列名指定为更改参数:
ALTER TABLE some_table DROP COLUMN useless_column;
更改列的数据类型
要更改列的数据类型,您可以使用 ALTER COLUMN
更改命令和 MODIFY COLUMN
列命令。此上下文中的参数包括列名及其新类型:
ALTER TABLE resident MODIFY COLUMN id INT;
其他表更改
许多其他类型的更改都可以通过 ALTER TABLE
命令实现。有关可用选项的更多信息,请查阅 MySQL 官方 ALTER TABLE
文档。
删除表
如果要删除表,可以使用 DROP TABLE
SQL 语句。这会删除表以及其中存储的任何数据。
基本语法如下:
DROP TABLE <table_name>;
如果表存在,此命令将删除表;如果表名不存在,则会抛出错误。
如果您希望在表存在时删除它,而在表不存在时不做任何操作,则可以在语句中包含 IF EXISTS
限定符:
DROP TABLE IF EXISTS <table_name>;
默认情况下,具有其他表或对象依赖关系的表在这些依赖关系存在时无法删除。
通过键入以下命令删除我们之前创建的 supplies
表:
DROP TABLE supplies;
我们将保留 teachers
表,以演示删除数据库的语句也会删除所有子对象,例如表。
删除数据库
DROP DATABASE
语句告诉 MySQL 删除指定的数据库。基本语法如下所示:
DROP DATABASE <database_name>;
将 <database_name>
占位符替换为您希望删除的数据库名称。如果找到该数据库,它将被删除。如果找不到该数据库,则会发生错误。
DROP DATABASE some_database;
ERROR 1008 (HY000): Can't drop database 'some_database'; database doesn't exist
如果您希望在数据库存在时删除它,否则不做任何操作,请包含可选的 IF EXISTS
选项:
DROP DATABASE IF EXISTS some_database;
Query OK, 0 rows affected, 1 warning (0.00 sec)
这将删除数据库,如果找不到则不执行任何操作。
要删除本指南中使用的 school
数据库,请列出系统上的现有数据库:
SHOW DATABASES;
+--------------------+Database |+--------------------+information_schema |mysql |performance_schema |school |sys |testing |+--------------------+6 rows in set (0.00 sec)
使用以下命令删除 school
数据库:
DROP DATABASE school;
这将删除 school
数据库以及其中定义的 teachers
表。
结论
本文介绍了如何使用 MySQL 创建和删除数据库和表的基础知识。这些是设置数据库系统和定义数据结构所需的一些最基本命令。
如前所述,本 MySQL 教程中涵盖的 SQL 语句,特别是 CREATE TABLE
语句,有许多额外的参数可用于更改系统的行为。您可以通过查阅官方 MySQL 文档了解更多信息。
常见问题
在 MySQL Workbench 中,您首先要创建新模型。
创建模型后,您就可以添加新模式,这在 MySQL 中等同于一个新数据库。
在 MySQL 中修改表的基本语法使用 ALTER TABLE
,如下所示:
ALTER TABLE <table_name> <change_command> <change_parameters>;
<change_command>
指示您希望进行的具体更改类型,无论是设置表上的不同选项、添加或删除列,还是更改类型或约束。
<change_parameters>
命令部分包含 MySQL 完成更改所需的任何额外信息。
要添加列,您可以使用 ADD
更改命令。它看起来像:
ALTER TABLE some_table ADD missing_column text;
在 MySQL 中,没有一个命令可以一次性删除所有表。您需要一个脚本来遍历所有表。
删除表的基本语法是使用 DROP TABLE
SQL 语句,并可选择包含 IF EXISTS
。
基本语法是:
DROP TABLE IF EXISTS <table_name>;
要在 MySQL 中删除索引,可以使用 DROP INDEX
命令。基本语法包括 <index_name>
和 <table_name>
。
它看起来像:
DROP INDEX <index_name> ON <table_name>;
在 MySQL 中创建表时,可以使用 TEMPORARY
关键字。这将创建一个只在当前会话中可见的临时表,并在会话关闭时自动删除。
基本语法与创建表时相同,只是包含了 TEMPORARY
。它看起来如下:
CREATE TEMPORARY TABLE table_name(column_1_definition,column_2_definition,...,table_constraints);