【MySQL】表的相关操作

【MySQL】表的相关操作这种做法相当于是把当初创建表时的有效操作给记录下来了 所以是最详细的 包含了说明和字符集等等 不过可以发现的时候上面的写法貌似和当初自己写的不太一样 这是因为 mysqld 要对命令进行语法和词法

大家好,欢迎来到IT知识分享网。

1. 表的创建

1.1 创建表语法

create table student ( 列属性名1 列数据类型, 列属性名2 列数据类型 ) character set 字符集 collate 校验集 engine 存储引擎 

可以在最后指定字符集等,也可以不指定使用默认配置的

也可以带选项,比如create table if not exists xxx;表示没有才创建

还有一种写法,比如有一张a表,然后像创建一张结构与a表一样的b表时语法如下:

create table b like a; 

1.2 创建表案例

mysql> create table users ( id int, name varchar(20) comment '用户名', password char(32) comment '32位密码', birthday date comment '生日' ) charset=utf8mb4; 

int表示整形,varchar表示变长字符串类型,char表示定长字符串类型,date表示日期类型,而comment表示对当前列属性的一个说明

当使用不同的存储引擎创建表时,最终在目录中所创建相关的文件个数是不同的,使用innoDB引擎时:

root@VM-16-3-ubuntu:/var/lib/mysql/base# ls users.ibd 

使用MyISAM引擎时:

root@VM-16-3-ubuntu:/var/lib/mysql/base# ls users_375.sdi users.MYD users.MYI 

1.3 查看表

使用show可以查看当前数据库中存在的表:

mysql> show tables; +----------------+ | Tables_in_base | +----------------+ | users | +----------------+ 1 row in set (0.00 sec) 

前提是要在对应的数据库中

要查看某个表的详细信息时使用desc:

mysql> desc users; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | password | char(32) | YES | | NULL | | | birthday | date | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 4 rows in set (0.01 sec) 

从左到右分别表示的是:字段名称(列属性)、字段类型、是否允许为空、索引类型、默认值和扩充

格式化显示带上\G:desc users \G;

如果要查看更加详细的表信息是可以使用如下指令:

mysql> show create table users; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | users | CREATE TABLE `users` ( `id` int DEFAULT NULL, `name` varchar(20) DEFAULT NULL COMMENT '用户名', `password` char(32) DEFAULT NULL COMMENT '32位密码', `birthday` date DEFAULT NULL COMMENT '生日' ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 

格式化显示只需要把最后的冒号换成\G:

mysql> show create table users \G * 1. row * Table: users Create Table: CREATE TABLE `users` ( `id` int DEFAULT NULL, `name` varchar(20) DEFAULT NULL COMMENT '用户名', `password` char(32) DEFAULT NULL COMMENT '32位密码', `birthday` date DEFAULT NULL COMMENT '生日' ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec) 

这种做法相当于是把当初创建表时的有效操作给记录下来了,所以是最详细的,包含了说明和字符集等等,不过可以发现的时候上面的写法貌似和当初自己写的不太一样,这是因为mysqld要对命令进行语法和词法分析,并对其按照标准进行修改优化,最后再去执行优化后的命令,也就是上面这样

2. 表的修改

2.1 修改表名

将表名user修改为us:

mysql> alter table users rename to us; Query OK, 0 rows affected (0.03 sec) mysql> show tables; +----------------+ | Tables_in_base | +----------------+ | us | +----------------+ 1 row in set (0.00 sec) 

其中to可以省略

还有一种写法:

rename table table_name_a to table_name_b [, ...] 

2.2 插入数据

插入一条记录:

mysql> insert into us values (1, 'lzh', '12345', '2003.9.10'); 

也叫全列插入

插入多条记录,中间使用逗号隔开

如果只想插入其中几列时写法如下:

mysql> insert into us (id, password) values (1, '12345'); 

前面一个括号里填入需要写入的列名,后面则是对应的数据,但要注意的是,当使用指定列插入时,必须确保:

  • 指定的列名在表中存在
  • 提供的值的数量与指定的列的数量相匹配
  • 值的类型与对应列的数据类型兼容。

而且如果表中有任何列被设置为not null且没有默认值,并且这些列没有被包括在insert语句中,那么将无法执行该insert操作,除非为这些列提供了默认值或允许它们接受null值

查看表内容:

mysql> select * from us; +------+------+----------+------------+ | id | name | password | birthday | +------+------+----------+------------+ | 1 | lzh | 12345 | 2003-09-10 | | 1 | zz | 12345 | 2003-09-10 | +------+------+----------+------------+ 

2.3 新增一列

假设新增一列用来保存存储路径:

mysql> alter table us add path varchar(128) comment '路径' after birthday; Query OK, 4 rows affected (0.06 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from us; +------+------+----------+------------+------+ | id | name | password | birthday | path | +------+------+----------+------------+------+ | 1 | lzh | 12345 | 2003-09-10 | NULL | | 1 | zz | 12345 | 2003-09-10 | NULL | | 4 | lzh | 12345 | 2003-09-10 | NULL | | 5 | pp | 666 | 2024-09-19 | NULL | +------+------+----------+------------+------+ 4 rows in set (0.00 sec) 

新增并不会对之前列中的数据产生影响,只是新增列中的数据为空

after xxx表示在xxx那一列之后添加

2.4 修改某列

2.4.1 修改列的类型

将name列的数据类型改为varchar(60):

mysql> alter table us modify name varchar(60); Query OK, 4 rows affected (0.05 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> show create table us \G; * 1. row * Table: us Create Table: CREATE TABLE `us` ( `id` int DEFAULT NULL, `name` varchar(60) DEFAULT NULL, `password` char(32) DEFAULT NULL COMMENT '32位密码', `birthday` date DEFAULT NULL COMMENT '生日', `path` varchar(128) DEFAULT NULL COMMENT '路径' ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec) ERROR: No query specifie 

可以发现,修改是直接覆盖最初的指令,把原来的属性和描述信息直接替换了

2.4.2 修改列名

把列名id改成user_id:

mysql> alter table us change column id user_id int; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc us; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | user_id | int | YES | | NULL | | | name | varchar(60) | YES | | NULL | | | password | char(32) | YES | | NULL | | | birthday | date | YES | | NULL | | | path | varchar(128) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+ 

change column 旧列名 新列名 新数据类型和属性 (约束)

column可以省略

2.5 删除某列

删除当前表中的password列:

mysql> alter table user drop password; Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> desc user; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | user_id | int | YES | | NULL | | | name | varchar(60) | YES | | NULL | | | birthday | date | YES | | NULL | | | path | varchar(128) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+ mysql> select * from user; +---------+------+------------+------+ | user_id | name | birthday | path | +---------+------+------------+------+ | 1 | lzh | 2003-09-10 | NULL | | 1 | zz | 2003-09-10 | NULL | | 4 | lzh | 2003-09-10 | NULL | | 5 | pp | 2024-09-19 | NULL | +---------+------+------------+------+ 

删除某列后,该列对应的数据也被删掉了

3. 表的删除

语法类似库的删除,很简单,drop table xxx:

mysql> show tables; +----------------+ | Tables_in_base | +----------------+ | stu | | user | +----------------+ 2 rows in set (0.00 sec) mysql> drop table stu; Query OK, 0 rows affected (0.04 sec) mysql> show tables; +----------------+ | Tables_in_base | +----------------+ | user | +----------------+ 1 row in set (0.00 sec) 

也可以带选项,比如drop table if exists xxx;存在才删除

4. 注意

和库一样,不要轻易对表进行修改和删除,因为数据库是比较接近底层的,上层程序可能有很多地方都要用到这个数据库以及对应的表,如果你把名字改了,那上层都得跟着改,降低了维护性

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112315.html

(0)
上一篇 2026-01-19 10:45
下一篇 2026-01-19 11:11

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信