数据库和数据表操作
本章将详细介绍MySQL中数据库和数据表的基本操作,包括创建数据库、删除数据库、创建数据表、查看数据表结构、修改数据表以及删除数据表等内容。通过本章的学习,您将掌握MySQL数据库和数据表的基本管理技能。
2.1 创建数据库
在MySQL中,创建数据库是使用数据库的第一步。创建数据库的基本语法如下:
CREATE DATABASE 数据库名 [选项];
其中,常用的选项包括:
CHARACTER SET
:指定数据库的字符集,如utf8mb4、gbk等。COLLATE
:指定数据库的排序规则,如utf8mb4_unicode_ci、gbk_chinese_ci等。
示例:创建数据库
-- 创建名为testdb的数据库,使用utf8mb4字符集
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建一个简单的数据库
CREATE DATABASE demo;
提示:MySQL 8.0默认使用utf8mb4字符集,这是一个推荐的字符集,它支持包括emoji表情在内的所有Unicode字符。在创建数据库时,建议显式指定字符集和排序规则,以确保数据的一致性。
2.2 删除数据库
当不再需要某个数据库时,可以使用DROP DATABASE语句将其删除。删除数据库将永久删除该数据库中的所有表和数据,因此请谨慎操作。基本语法如下:
DROP DATABASE [IF EXISTS] 数据库名;
其中,IF EXISTS
是可选的,如果指定了这个选项,当要删除的数据库不存在时,MySQL不会报错。
示例:删除数据库
-- 删除名为demo的数据库
DROP DATABASE demo;
-- 如果存在名为testdb的数据库,则删除它
DROP DATABASE IF EXISTS testdb;
警告:删除数据库是一个高风险操作,一旦执行将无法撤销。在删除数据库之前,请确保已经备份了重要数据,并且确认不再需要该数据库。
2.3 创建数据表
数据表是MySQL中存储数据的基本单位。创建数据表时,需要指定表名、字段名、字段数据类型以及各种约束条件。创建数据表的基本语法如下:
CREATE TABLE 表名 (
字段名1 数据类型 [约束],
字段名2 数据类型 [约束],
...
[表级约束]
) [表选项];
接下来,我们将详细介绍创建数据表时常用的约束条件。
2.3.1 使用主键约束
主键约束(PRIMARY KEY)用于唯一标识表中的每一行数据。一个表只能有一个主键,主键字段的值不能为空且必须唯一。
示例:使用主键约束
-- 创建一个带有主键约束的表
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
gender VARCHAR(10)
);
-- 复合主键(多个字段组合作为主键)
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
2.3.2 使用外键约束
外键约束(FOREIGN KEY)用于建立表与表之间的关联关系,确保数据的完整性和一致性。外键字段的值必须来自于关联表的主键字段的值。
示例:使用外键约束
-- 创建部门表(主表)
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
-- 创建员工表(从表),并添加外键约束
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
2.3.3 使用非空约束
非空约束(NOT NULL)用于确保字段的值不能为空。如果插入或更新数据时,该字段没有提供值,则MySQL会报错。
示例:使用非空约束
-- 创建带有非空约束的表
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
age INT
);
2.3.4 使用唯一性约束
唯一性约束(UNIQUE)用于确保字段的值是唯一的,但允许为空。一个表可以有多个唯一性约束。
示例:使用唯一性约束
-- 创建带有唯一性约束的表
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(50) NOT NULL,
product_code VARCHAR(20) UNIQUE,
price DECIMAL(10,2)
);
2.3.5 使用默认约束
默认约束(DEFAULT)用于为字段设置默认值。如果插入数据时没有为该字段提供值,则MySQL会自动使用默认值。
示例:使用默认约束
-- 创建带有默认约束的表
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE DEFAULT CURRENT_DATE,
status VARCHAR(20) DEFAULT 'Pending'
);
2.3.6 设置表的属性值自动增加
在MySQL中,可以使用AUTO_INCREMENT关键字使字段的值自动增加。这通常用于主键字段,确保每个记录都有唯一的标识。
示例:设置自动增量
-- 创建带有自动增量字段的表
CREATE TABLE articles (
article_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content TEXT,
publish_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
提示:在MySQL 8.0中,自增变量已经实现了持久化,这意味着即使重启MySQL服务,自增列的值也会从上次的值继续增加,而不会重置。
2.4 查看数据表结构
在MySQL中,可以使用多种方法查看数据表的结构,包括查看表的基本结构和详细结构。
2.4.1 查看表基本结构语句DESCRIBE
DESCRIBE语句用于查看表的基本结构,包括字段名、数据类型、是否允许为空、键信息、默认值和额外信息等。
DESCRIBE 表名;
-- 或者使用简写形式
desc 表名;
示例:使用DESCRIBE查看表结构
-- 查看students表的基本结构
desc students;
-- 输出示例
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
2.4.2 查看表详细结构语句SHOW CREATE TABLE
SHOW CREATE TABLE语句用于查看表的详细结构,包括表的创建语句、引擎类型、字符集等信息。
SHOW CREATE TABLE 表名;
示例:使用SHOW CREATE TABLE查看表结构
-- 查看students表的详细结构
SHOW CREATE TABLE students;
-- 输出示例
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| students | CREATE TABLE `students` (
`id` int(11) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`gender` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2.5 修改数据表
在MySQL中,可以使用ALTER TABLE语句修改数据表的结构,包括修改表名、修改字段的数据类型、修改字段名、添加字段、删除字段等操作。
2.5.1 修改表名
修改表名的基本语法如下:
ALTER TABLE 旧表名 RENAME TO 新表名;
-- 或者使用简写形式
ALTER TABLE 旧表名 RENAME 新表名;
示例:修改表名
-- 将表名从students修改为school_students
ALTER TABLE students RENAME TO school_students;
-- 再次将表名修改回students
ALTER TABLE school_students RENAME students;
2.5.2 修改字段的数据类型
修改字段数据类型的基本语法如下:
ALTER TABLE 表名 MODIFY 字段名 新数据类型 [约束];
示例:修改字段的数据类型
-- 将students表中的name字段的数据类型修改为VARCHAR(100)
ALTER TABLE students MODIFY name VARCHAR(100);
-- 将age字段的数据类型修改为TINYINT,并添加非空约束
ALTER TABLE students MODIFY age TINYINT NOT NULL;
2.5.3 修改字段名
修改字段名的基本语法如下:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型 [约束];
示例:修改字段名
-- 将students表中的gender字段修改为sex
ALTER TABLE students CHANGE gender sex VARCHAR(10);
-- 将name字段修改为full_name,并同时修改数据类型
ALTER TABLE students CHANGE name full_name VARCHAR(100);
2.5.4 添加字段
向表中添加新字段的基本语法如下:
ALTER TABLE 表名 ADD 字段名 数据类型 [约束] [FIRST|AFTER 已存在字段名];
其中,FIRST
表示将新字段添加到表的第一个位置,AFTER 已存在字段名
表示将新字段添加到指定字段的后面。如果不指定位置,则默认添加到表的最后。
示例:添加字段
-- 向students表中添加address字段
ALTER TABLE students ADD address VARCHAR(200);
-- 向students表中添加email字段,并放在name字段的后面
ALTER TABLE students ADD email VARCHAR(100) AFTER name;
-- 向students表中添加phone字段,并设置为表的第一个字段
ALTER TABLE students ADD phone VARCHAR(20) FIRST;
2.5.5 删除字段
从表中删除字段的基本语法如下:
ALTER TABLE 表名 DROP 字段名;
示例:删除字段
-- 从students表中删除phone字段
ALTER TABLE students DROP phone;
-- 从students表中删除email字段
ALTER TABLE students DROP email;
2.5.6 修改字段的排列位置
修改字段排列位置的基本语法如下:
ALTER TABLE 表名 MODIFY 字段名 数据类型 [约束] FIRST|AFTER 已存在字段名;
示例:修改字段的排列位置
-- 将students表中的address字段移到name字段的后面
ALTER TABLE students MODIFY address VARCHAR(200) AFTER name;
-- 将students表中的id字段移到表的第一个位置
ALTER TABLE students MODIFY id INT PRIMARY KEY FIRST;
2.5.7 更改表的存储引擎
更改表的存储引擎的基本语法如下:
ALTER TABLE 表名 ENGINE=新存储引擎;
示例:更改表的存储引擎
-- 将students表的存储引擎修改为MyISAM
ALTER TABLE students ENGINE=MyISAM;
-- 将students表的存储引擎修改为InnoDB
ALTER TABLE students ENGINE=InnoDB;
提示:MySQL 8.0默认使用InnoDB存储引擎,它支持事务、行级锁、外键等高级特性,是大多数应用的推荐选择。
2.5.8 删除表的外键约束
删除表的外键约束的基本语法如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
要删除外键约束,首先需要知道外键约束的名称。可以通过SHOW CREATE TABLE语句查看外键约束的名称。
示例:删除表的外键约束
-- 先查看employees表的创建语句,找到外键约束的名称
SHOW CREATE TABLE employees;
-- 假设外键约束名称为employees_ibfk_1,删除该外键约束
ALTER TABLE employees DROP FOREIGN KEY employees_ibfk_1;
2.6 删除数据表
当不再需要某个数据表时,可以使用DROP TABLE语句将其删除。删除数据表将永久删除该表中的所有数据,因此请谨慎操作。
2.6.1 删除没有被关联的表
删除没有被其他表关联的表的基本语法如下:
DROP TABLE [IF EXISTS] 表名;
示例:删除没有被关联的表
-- 删除名为temp_table的表
DROP TABLE temp_table;
-- 如果存在名为backup_table的表,则删除它
DROP TABLE IF EXISTS backup_table;
2.6.2 删除被其他表关联的主表
如果要删除的表是其他表的主表(即被其他表的外键约束引用),则直接删除会失败。此时,有两种解决方法:
- 先删除引用该表的所有外键约束,然后再删除该表。
- 使用
CASCADE
选项删除表,这会同时删除引用该表的所有外键约束。
示例:删除被其他表关联的主表
-- 方法1:先删除外键约束,再删除表
ALTER TABLE employees DROP FOREIGN KEY employees_ibfk_1;
DROP TABLE departments;
-- 方法2:使用CASCADE选项删除表(注意:这在MySQL中不直接支持,需要先删除引用表)
-- 先删除引用表
DROP TABLE employees;
-- 再删除主表
DROP TABLE departments;
警告:删除数据表是一个高风险操作,一旦执行将无法撤销。在删除数据表之前,请确保已经备份了重要数据,并且确认不再需要该表。