关于 MySQL 表的创建、查看、修改与删除操作
1. 创建表
CREATE TABLE IF NOT EXISTS 表名 (
列名1 数据类型,
列名2 数据类型,
列名3 数据类型
) CHARACTER SET 字符集 COLLATE 校验规则 ENGINE 存储引擎;
field
表示列名,是表中数据的存储单元,列名应具有明确的含义,方便理解和维护。datatype
表示列的类型,如int
(整数类型)、varchar
(可变长度字符串类型)等,用于定义数据的格式。选择合适的数据类型可以节省存储空间并提高查询效率。character set
是字符集,如果没有指定字符集,则以所在数据库的字符集为准。字符集用于定义数据的编码方式,如utf8
可以支持多种语言的字符,适合国际化应用。collate
是校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准。校验规则用于定义字符比较的方式,不同的校验规则可能导致字符串比较的结果不同。engine
是存储引擎,不同的存储引擎有不同的特性。例如,MyISAM
存储引擎支持全文索引,但不支持事务;InnoDB
存储引擎支持事务、行级锁等特性,适合高并发的场景。
2. 创建表案例
说明:
不同的存储引擎,创建表的文件不一样。例如,users
表存储引擎是 MyISAM
,在数据目录中有三个不同的文件,分别是:
users.frm
:表结构文件,存储表的定义信息,包括表的列定义、索引定义等。users.MYD
:表数据文件,存储表中的数据记录。users.MYI
:表索引文件,存储表的索引信息,用于加速数据查询。
如果创建一个存储引擎为 InnoDB
的表,其文件存储方式会有所不同,InnoDB
表的数据和索引通常存储在共享表空间或独立表空间中,而不是像 MyISAM
那样有单独的 .MYD
和 .MYI
文件。
创建一个 engine
是 innodb
的数据库,观察存储目录。
CREATE TABLE users (
id int,
name varchar(20) COMMENT '用户名',
password char(32) COMMENT '密码是32位的md5值',
birthday date COMMENT '生日'
) CHARACTER SET utf8 ENGINE MyISAM;
在创建表时,
COMMENT
用于为列添加注释,方便后续理解和维护表结构。CHARACTER SET utf8
指定了字符集为utf8
,这样可以存储多种语言的字符。ENGINE MyISAM
指定了存储引擎为MyISAM
,根据实际需求可以选择其他存储引擎,如InnoDB
。
3. 查看表结构
DESC 表名;
DESC
是DESCRIBE
的简写,用于查看表的结构信息。执行该语句后,会显示表的列名、数据类型、是否允许为空、键信息、默认值和额外信息等。
4. 修改表
在项目实际开发中,经常需要修改某个表的结构,比如字段名字、字段大小、字段类型、表的字符集类型、表的存储引擎等。此外,还可能需要添加字段、删除字段等。这时就需要对表进行修改。
添加列
ALTER TABLE [tablename] ADD (
column datatype [DEFAULT expr]
[, column datatype]...);
ALTER TABLE 表名 ADD (
列名 数据类型 [DEFAULT 默认值]
[, 列名 数据类型]...);
tablename
是要修改的表名。column
是要添加的列名。datatype
是列的数据类型。DEFAULT expr
是为新列设置的默认值表达式(可选)。
修改列
ALTER TABLE [tablename] MODIFY (
column datatype [DEFAULT expr]
[, column datatype]...);
ALTER TABLE 表名 MODIFY (
列名 新数据类型 [DEFAULT 新默认值]
[, 列名 新数据类型]...);
tablename
是要修改的表名。column
是要修改的列名。datatype
是修改后的列的数据类型。DEFAULT expr
是为修改后的列设置的默认值表达式(可选)。
删除列
ALTER TABLE [tablename] DROP (column);
ALTER TABLE 表名 DROP (列名);
tablename
是要修改的表名。column
是要删除的列名。
这些语句用于对 MySQL 数据库中的表进行结构修改,包括添加新列、修改现有列的定义以及删除列。在执行这些操作时,需要确保对表结构的修改不会影响现有数据的完整性和应用的正常运行。
在 users
表中添加两条记录。
INSERT INTO users VALUES (1, 'a', 'b', '1982-01-04'), (2, 'b', 'c', '1984-01-04');
在 users
表中添加一个字段,用于保存图片路径。
ALTER TABLE users ADD assets VARCHAR(100) COMMENT '图片路径' AFTER birthday;
使用
ALTER TABLE
添加字段时,可以通过AFTER
指定新字段插入的位置,如果不指定,则默认添加到表的最后。
插入新字段后,对原来表中的数据没有影响。
DESC users;
输出结果:
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| password | char(32) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| assets | varchar(100) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
查看表中数据:
SELECT * FROM users;
输出结果:
+------+------+----------+------------+-------+
| id | name | password | birthday | assets|
+------+------+----------+------------+-------+
| 1 | a | b | 1982-01-04 | NULL |
| 2 | b | c | 1984-01-04 | NULL |
+------+------+----------+------------+-------+
修改 name
,将其长度改成 60。
ALTER TABLE users MODIFY name VARCHAR(60);
使用
MODIFY
修改字段时,需要重新定义字段的数据类型等属性,如果只是修改字段名,可以使用CHANGE
。
删除 password
列。
ALTER TABLE users DROP password;
注意:删除字段一定要小心,删除字段及其对应的列数据都会丢失。
修改表名为 employee
。(to 可以省略)
ALTER TABLE users RENAME TO employee;
将 name
列修改为 xingming
。(to 可以省略)
ALTER TABLE employee CHANGE name xingming VARCHAR(60);
使用
CHANGE
修改字段名时,需要指定新字段名和数据类型,即使数据类型不变也需要重新声明。
5. 删除表
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
TEMPORARY
表示要删除的是临时表。IF EXISTS
用于避免在表不存在时产生错误,如果表不存在,执行该语句不会报错。可以一次性删除多个表,只需在表名之间用逗号分隔。
删除表 t1
。
DROP TABLE t1;
在执行删除表操作时,表中的所有数据和结构都会被永久删除,因此在执行该操作前,一定要确保不再需要该表中的数据。