【MySQL】表的相关操作

embedded/2024/11/13 10:08:40/

目录

  • 1. 表的创建
    • 1.1 创建表语法
    • 1.2 创建表案例
    • 1.3 查看表
  • 2. 表的修改
    • 2.1 修改表名
    • 2.2 插入数据
    • 2.3 新增一列
    • 2.4 修改某列
      • 2.4.1 修改列的类型
      • 2.4.2 修改列名
    • 2.5 删除某列
  • 3. 表的删除
  • 4. 注意

1. 表的创建

1.1 创建表语法

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

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

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

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) 

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

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

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可以省略

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: 0mysql> 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: 0mysql> 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: 0mysql> 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: 0mysql> 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. 注意

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


http://www.ppmy.cn/embedded/114145.html

相关文章

优化Web性能:Varnish中精准识别并缓存移动与桌面请求

引言 在现代Web开发中,为了提升用户体验,针对不同类型的设备提供定制化的内容是一项重要的策略。Varnish作为HTTP加速器和缓存代理服务器,能够帮助我们实现这一目标。本文将详细介绍如何利用Varnish来实现基于设备类型(PC端与移动…

【C语言】(指针系列3)数组指针+函数指针+typedef+函数数组指针+转移表

前言:前言:开始之前先感谢一位大佬,清风~徐~来-CSDN博客,由于是时间久远,博主指针的系列忘的差不多了,所以有顺序部分借鉴了该播主的,同时也加入了博主自己的理解,有些地方如果解释的…

Qt学习之旅 I

构建一个跨平台的应用(Create A Cross-Platform Application) 目录 构建一个跨平台的应用(Create A Cross-Platform Application) 设计模式 开始构建 Qt是跨平台的C框架,这里,我们将会构建一个简单的C跨平台项目来熟悉QT是如何实现简单的跨平台的。 …

上传富文本插入文件时报错:JSON parse error: Unexpected character解决办法

方式一(加密解密): 1.前端 (1)安装 crypto-js npm install crypto-js(2)util下引入asc.js asc.js import CryptoJS from crypto-js// 需要和后端一致 const KEY CryptoJS.enc.Utf8.parse(…

前端开发规范

前端开发规范 编写背景:当前项目前端开发过程中,每个人有不同的编码风格,这就导致同一个模块不同人开发时可能产生阅读不方便的情况,这对于项目的长久开发是不利的,所以编写这套前端开发规范。 编写目的:避…

google map小叉号不显示

背景需求 需要在uniapp中接入google地图,研究了一番,都没有找到合适的,现在说一下教程。 效果图 前期工作 这两点缺一不可,否则你啥也看不到。 1、电脑安装L-O-U梯 用于访问G-OO-G-LE的API或者创建google map key。 2、手机安装L-O-U梯 用于显示google地图。我就是手…

C++ ——string的模拟实现

目录 前言 浅记 1. 构造函数 2. 拷贝构造函数 2.1 拷贝构造传统写法 2.2 拷贝构造现代写法 3. swap 4. 赋值重载 4.1 赋值重载的传统写法 4.2 赋值重载的现代写法1 4.3 赋值重载的现代写法2 5. 析构函数 6. reserve(扩容) 7. push_back&am…

Windows10安装cuda11.3.0+cudnn8.5.0,以及创建conda虚拟环境(pytorch)

1、检查电脑驱动版本为561.09&#xff0c;选择cuda版本&#xff0c;下图可知cuda版本<12.6。 nvidia-smi #查看驱动版本&#xff0c;以及最大可以安装的cuda版本 2、Anaconda3-2024.06-1-Windows-x86_64.exe下载&#xff1a; 官网&#xff1a;https://www.baidu.com/link?…