【Mysql】基础命令操作

news2024/11/25 23:01:42

本文首发于 慕雪的寒舍

mysql的基础命令

本文所用mariadb版本

mysql  Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1

sql语句的分类

  • DDL【data definition language】 数据定义语言,用来维护存储数据的结构。代表指令: create, drop, alter
  • DML【data manipulation language】 数据操纵语言,用来对数据进行操作。代表指令: insert,delete,update
    • DML中又单独分了一个DQL,数据查询语言,代表指令: select
  • DCL【Data Control Language】 数据控制语言,主要负责权限管理和事务。 代表指令: grant,revoke,commit

0.连接mysql

默认情况下,我们的mysql没有密码,直接使用如下命令,就能链接上mysql

mysql -uroot;

mysql数据库文件路径

/var/lib/mysql

mysql的语句是大小写不敏感的,大小写都可以。

0.1 查看有谁连接了

show processlist;

该命令可以查看当前有谁连接了,所在数据库是什么,正在执行的cmd是什么

image-20230415154733573

0.2 查看引擎

mysql支持多种存储引擎

存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

每个引擎各有其优势。可以用下面的语句查询当前支持的引擎

show engines;

image-20230415110657396

1.数据库

1.1 创建

create database 数据库名字;
create database if not exists 数据库名字; # 如果不存在才创建
create database hello;

上面的命令创建了一个名为hello的数据库。对于mysql服务端而言,其实际上是在数据文件路径中,帮我们创建了一个对应的文件夹

image-20230415105802521

如果是mysql5.7,在创建语句之前新增一个show,可以看到当前执行语句的详细信息。我当前使用的是高版本的mariadb,不支持这个操作

show create database hello;

创建数据库或者表的时候,我们还可以给名称带上如下符号作为分割符

create database `数据库名称`;
MariaDB [(none)]> create database `test2`;
Query OK, 1 row affected (0.001 sec)

带上该符号后,可以用于区分你的表名和数据库的内置语句。建议创建、删除操作的时候,都给名字带上这个符号。

当然,创建的数据库、表名最好不要mysql内置语句冲突,这和写代码的时候不要用编程语言的关键字/库函数名来命名变量一样。

1.2 查看已有

show databases;

查看当前已有数据库

+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

1.3 进入

进入这个数据库

 use hello;

1.4 删除

drop database [if exists] 名字;

如下,我先是创建了一个test1数据库

MariaDB [(none)]> create database test1;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
| test1              |
+--------------------+
5 rows in set (0.000 sec)

用下面这个命令删除该数据库

drop database test1;

成功删除

MariaDB [(none)]> drop database test1;
Query OK, 0 rows affected (0.035 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

数据文件路径中,test1文件夹也被对应删除

image-20230415105910841

1.5 字符集和校验规则

字符集会有自己对应的校验规则

  • 字符集用于将数据以特定编码存入数据库
  • 校验规则用于数据时对数据进行校验

修改字符集的时候,mysql会为我们自动指定对应的校验规则

1.5.1 字符集

一个数据被存放的时候,是会有其所用的编码的。编码不相同,会导致数据在不同软件中显示出不同的结果。

比如 我们使用VS写的C语言代码,文件内的中文注释放入devc++之中,有可能会乱码,这就是字符编码不匹配的原因

show variables like 语句可以查看mysql的内置变量,其中如下变量就是数据库字符集的编码格式

show variables like 'character_set_database';

可以看到,为utf-8

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.002 sec)

在配置mariadb的时候,就已经修改过了数据库的编码规则,所以所有相关字符集编码都是utf-8

show variables like 'character_set_%';
MariaDB [(none)]> show variables like 'character_set_%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                         |
| character_set_database   | utf8                         |
| character_set_filesystem | binary                       |
| character_set_results    | utf8                         |
| character_set_server     | utf8                         |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.002 sec)

使用如下命令可以查看数据库支持的所有编码

show charset;
MariaDB [(none)]> show charset;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode               | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode              | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode            | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode              | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset       | binary              |      1 |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.001 sec)

1.5.2 校验规则

show variables like 'collation_%';

如下可以看到,当前的校验规则都是utf-8相关的

MariaDB [(none)]> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.001 sec)

查看系统中所有校验集

show collation;

结果很长,就不全贴出来了。能看到每一个编码集都对应了一个字符集

image-20230415114232320

1.5.3 创建库时指定

CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]

create_specification:
    [DEFAULT] CHARACTER SET charset_name
    [DEFAULT] COLLATE collation_name

其中[]代表是可选项

  • CHARACTER SET 指定数据库采用的字符集
  • COLLATE 指定数据库字符集的校验规则

如果在创建数据库时没有指定字符集和校验规则,则会采用数据库默认的。

在数据库的文件夹中,有一个db.opt文件,其中就包含了当前数据库使用的字符集和校验规则

[root@1c2261732150:/var/lib/mysql]# ls hello
db.opt  stu_test.frm  stu_test.ibd
[root@1c2261732150:/var/lib/mysql]# cat hello/db.opt
default-character-set=utf8
default-collation=utf8_general_ci

如果在创建的时候指明字符集编码

create database `test1` character set gbk; 
create database `test1` charset=gbk; # 两种写法相同 

查看db.opt,可以看到系统自动指定了gbk字符集对应的校验和

[root@1c2261732150:/var/lib/mysql]# ls test1
db.opt
[root@1c2261732150:/var/lib/mysql]# cat test1/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci

同时指定字符集和编码

create database `test2` charset=utf8 collate utf8_bin;

执行成功后,查看本地文件

[root@1c2261732150:/var/lib/mysql]# cat test2/db.opt
default-character-set=utf8
default-collation=utf8_bin

成功设置了字符集和编码规则


虽然在创建的时候可以这么做,但我们保持默认配置的utf8即可

1.5.4 校验的影响

通过指定不同的编码,我创建了两个校验规则不同的数据库

MariaDB [(none)]> create database test_ci charset=utf8;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> create database test_bin charset=utf8 collate utf8_bin;
Query OK, 1 row affected (0.000 sec)

其中一个的校验规则是utf8_general_ci,另外一个是utf8_bin

[root@1c2261732150:/var/lib/mysql]# cat test_bin/db.opt
default-character-set=utf8
default-collation=utf8_bin
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_general_ci

utf8_bin

先进入test_bin数据库

use test_bin;

创建一个student表,只有一个字符串类型的name字段

create table student(name varchar(30));

插入如下数据

MariaDB [test_bin]> insert into student value ('a');
Query OK, 1 row affected (0.042 sec)

MariaDB [test_bin]> insert into student value ('A');
Query OK, 1 row affected (0.008 sec)

MariaDB [test_bin]> insert into student value ('b');
Query OK, 1 row affected (0.003 sec)

MariaDB [test_bin]> insert into student value ('B');
Query OK, 1 row affected (0.004 sec)

MariaDB [test_bin]> insert into student value ('c');
Query OK, 1 row affected (0.009 sec)

MariaDB [test_bin]> insert into student value ('C');
Query OK, 1 row affected (0.007 sec)

查看已有数据,分别是大小写的abc

MariaDB [test_bin]> select * from  student;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.001 sec)

查询数据,可以看到,返回的结果是只有小写a的

MariaDB [test_bin]> select * from student where name='a';
+------+
| name |
+------+
| a    |
+------+
1 row in set (0.001 sec)

执行排序(升序)后输出,得到如下结果。我们知道,小写字母的ASCII是在大写字母的之后的,所以这个排序结果是正确的。

MariaDB [test_bin]> select * from student order by name;
+------+
| name |
+------+
| A    |
| B    |
| C    |
| a    |
| b    |
| c    |
+------+
6 rows in set (0.001 sec)

utf8_general_ci

use test_ci;

在这个数据库中进行相同的插入工作,创建表,插入大小写abc(命令同上不再重复)

MariaDB [test_ci]> select * from  student;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.000 sec)

执行查询语句,发现当我们查询小a的时候,同时返回了A和a的结果

MariaDB [test_ci]> select * from student where name='a';
+------+
| name |
+------+
| a    |
| A    |
+------+
2 rows in set (0.001 sec)

排序的时候,大小a没有按ASCII码顺序排,而是放到了一起

MariaDB [test_ci]> select * from student order by name;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.001 sec)

结论

  • utf8_bin:查询的时候区分大小写
  • utf8_general_ci:查询时忽略大小写

在实际场景中,我们就可以根据需求,选择这两个校验规则中的其一作为我们数据库的校验规则。

这两个只是众多校验规则之一,更多编码的区别,还得等后续慢慢探寻。在一般场景中,使用utf8是完全足够的。

1.6 修改

alter database 数据库名 [create_specification [,
create_specification] ...];

一般情况下,我们修改的是数据库的字符集和校验规则。

示例如下,修改数据库test_ci的字符集为gbk

MariaDB [test_ci]> alter database test_ci charset=gbk;
Query OK, 1 row affected (0.006 sec)

修改后查看配置文件,字符集和校验规则确实变化了(系统自动查找对应的校验规则)

[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci

也可以同时修改校验规则,这里和新建数据库时的操作是一样的

alter database test_ci charset=utf8 collate utf8_bin;
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_bin

1.7 备份数据库

1.7.1 备份一个数据库

如下操作是在linux命令行中执行的

mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径

示例

mysqldump -P3306 -u root -B hello > hello.bak.sql

这会在当前路径中出现了一个sql文件,其内容如下。

-- MySQL dump 10.19  Distrib 10.3.28-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: hello
-- ------------------------------------------------------
-- Server version       10.3.28-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `hello`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hello` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `hello`;

--
-- Table structure for table `stu_test`
--

DROP TABLE IF EXISTS `stu_test`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stu_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `score` decimal(4,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `stu_test`
--

LOCK TABLES `stu_test` WRITE;
/*!40000 ALTER TABLE `stu_test` DISABLE KEYS */;
INSERT INTO `stu_test` VALUES (2,'小图图',5,72.80),(3,'大司马',42,87.30),(4,'乐迪',32,99.00);
/*!40000 ALTER TABLE `stu_test` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2023-04-15 15:20:25

我们会发现这里面的内容其实都是sql语句,如果将这个备份导入到另外一个数据库中,实际上就是将历史的所有sql语句全部执行一遍!

除此之外,复制/var/lib/mysql下的数据库文件也是可行的一种备份方案。但并不推荐这么做!

1.7.2 备份数据库中的多张表

mysqldump -u root -p 数据库名 表名1 表名2 > 备份文件名

1.7.3 同时备份多个数据库

mysqldump -u root -p -B 数据库名1 数据库名2  > 备份文件名

1.7.4 还原

如下命令需要在mysql中执行

source 备份文件路径
# 示例
source /root/hello.bak.sql;

image-20230415152700967

数据库中的内容和原有数据库是完全相同的

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| stu_test        |
+-----------------+
1 row in set (0.001 sec)

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name      | age  | score |
+----+-----------+------+-------+
|  2 | 小图图    |    5 | 72.80 |
|  3 | 大司马    |   42 | 87.30 |
|  4 | 乐迪      |   32 | 99.00 |
+----+-----------+------+-------+
3 rows in set (0.001 sec)

1.7.5 化简

如果你看过了上面对校验影响的验证,其中我往test_bin数据库中使用6条语句插入了大小写的abc。

但当我们执行备份的时候,可以看到备份出来的sql文件,六个语句被合并了!

INSERT INTO `student` VALUES ('a'),('A'),('b'),('B'),('c'),('C');

这也是mysql备份的智能之处之一!

2.表

如下命令需要先进入database才能执行

2.1 创建

基础的创建操作如下。其中末尾的字符集、校验规则、存储引擎的设置项可以留空不填

  • field 列名
  • datatype 列的类型
create table 表名 (
    field1 datatype,
    field2 datatype,
    field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;

示例如下,创建了一个student表,并配置了两个键值name和age,类型分别为字符串和int

create table student(
    name varchar(30),
    age int
);

除了基础操作之外,我们还可以给这个表新增一个comment作为备注

create table student(
    name varchar(30) comment '学生名字',
    age int comment '学生年龄'
);

用下面的语句可以查看创建表时候的操作

show create table 表名;

image-20230415161430461

这部分和备份的时候的sql也是一样的,mysql会帮我们自动规整语句,使其语法规则更规整;

如下语句也能看到创建表时所用命令

show create table stu_test\G
MariaDB [hello]> show create table stu_test\G
*************************** 1. row ***************************
       Table: stu_test
Create Table: CREATE TABLE `stu_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `score` decimal(4,2) DEFAULT NULL,
  `avatar` varchar(100) NOT NULL DEFAULT 'default-avatar.png' COMMENT '头像图片路径',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.000 sec)

二者结果是类似的

image-20230506110031599

2.2 查看已有表

show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| student         |
+-----------------+
1 row in set (0.001 sec)

2.3 查看表的属性/结构

desc 表名;
MariaDB [hello]> desc stu_test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30)  | YES  |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
| score | decimal(4,2) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.002 sec)

2.4 删除该表

drop table student;

2.5 修改表的结构

注意,这里是对表的属性的修改,并不是对数据的修改!

比如我想新增字段,或者修改已有字段的属性,或者删除字段

-- 新增字段
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);
-- 修改字段
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
-- 删除字段
ALTER TABLE tablename DROP (column);

2.5.0 注意事项

请注意:修改表的字段是一个很麻烦的操作,其可能会涉及到已有数据的有效性问题

  • 请在生产环境上线前的测试阶段,完成表字段的定义!

说人话就是,前期设计要想的尽量到位,避免后期表中已有数据的时候修改表的属性!

2.5.1 新增字段

比如我给上方2.5中出现过的stu_test表新增一列,可以用如下的命令

alter table stu_test add avatar varchar(100) comment '头像图片路径' after
score;
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name      | age  | score |
+----+-----------+------+-------+
|  2 | 小图图    |    5 | 72.80 |
|  3 | 大司马    |   42 | 87.30 |
|  4 | 乐迪      |   32 | 99.00 |
|  5 | dc872458  |   25 |  NULL |
+----+-----------+------+-------+
4 rows in set (0.000 sec)

MariaDB [hello]> alter table stu_test add avatar varchar(100) comment '头像图片路径' after
    -> score;
Query OK, 0 rows affected (0.005 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------+
| id | name      | age  | score | avatar |
+----+-----------+------+-------+--------+
|  2 | 小图图    |    5 | 72.80 | NULL   |
|  3 | 大司马    |   42 | 87.30 | NULL   |
|  4 | 乐迪      |   32 | 99.00 | NULL   |
|  5 | dc872458  |   25 |  NULL | NULL   |
+----+-----------+------+-------+--------+
4 rows in set (0.000 sec)

此时可以看到,已有数据都多了一个avatar字段,且这些已有数据的新字段都为NULL

说明新增字段并不会影响旧数据的旧字段。我们可以在新增字段之后,给旧的数据修改默认值

2.5.2 删除字段

如果表中的数据只剩一列(只有一个字段)是不能删除这个字段的(只能删除这个表)

使用如下命令,删除刚刚新增的avatar字段

alter table stu_test drop avatar;

可以看到avatar列被删除了

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------+
| id | name      | age  | score | avatar |
+----+-----------+------+-------+--------+
|  2 | 小图图    |    5 | 72.80 | NULL   |
|  3 | 大司马    |   42 | 87.30 | NULL   |
|  4 | 乐迪      |   32 | 99.00 | NULL   |
|  5 | dc872458  |   25 |  NULL | NULL   |
+----+-----------+------+-------+--------+
4 rows in set (0.000 sec)

MariaDB [hello]> alter table stu_test drop avatar;
Query OK, 0 rows affected (0.034 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name      | age  | score |
+----+-----------+------+-------+
|  2 | 小图图    |    5 | 72.80 |
|  3 | 大司马    |   42 | 87.30 |
|  4 | 乐迪      |   32 | 99.00 |
|  5 | dc872458  |   25 |  NULL |
+----+-----------+------+-------+
4 rows in set (0.000 sec)

在具体场景中,如果需要给已有用户新增头像,一般存放的是头像的文件路径(而不是图片),此时我们就可以设计一个默认头像,并在新增字段的时候将默认值(默认的头像文件路径)修改为这个默认头像图片的路径。

比如我现在的头像存储的文件路径是

./images/

此时存放的用户头像文件就应该放到这个目录中,而mysql中只需要存放文件的路径。

比如用户上传了一个头像图片,我们将头像图片保存到这个路径,再往sql中的avatar字段插入路径

./images/test-img.png
sql中只需要保存test-img.png,取图片的时候拼接上前方的文件路径

设计一个默认头像,也是放在这个路径中

./images/test-img.png
./images/default-avatar.png

这时候新增avatar字段的时候,就可以指定默认值

alter table stu_test add avatar varchar(100) not null default 'default-avatar.png'  comment '头像图片路径' after
score;

这时候就能看到,旧数据的头像都是默认头像了!

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
|  2 | 小图图    |    5 | 72.80 | default-avatar.png |
|  3 | 大司马    |   42 | 87.30 | default-avatar.png |
|  4 | 乐迪      |   32 | 99.00 | default-avatar.png |
|  5 | dc872458  |   25 |  NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.000 sec)

默认头像总好过没有图片嘛!

2.5.3 修改字段类型

在设计stu_test表的时候,只给name分配了30个字节的空间。此时如果来了个名字特别特别长的新同学(有些地方的人名确实很长)

我们发现30个字节存不下这个名字了,就可以考虑将名字字段的长度增加

alter table stu_test modify name varchar(60);

如下,成功修改!

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+----------------+
| Field  | Type         | Null | Key | Default            | Extra          |
+--------+--------------+------+-----+--------------------+----------------+
| id     | int(11)      | NO   | PRI | NULL               | auto_increment |
| name   | varchar(30)  | YES  |     | NULL               |                |
| age    | int(11)      | YES  |     | NULL               |                |
| score  | decimal(4,2) | YES  |     | NULL               |                |
| avatar | varchar(100) | NO   |     | default-avatar.png |                |
+--------+--------------+------+-----+--------------------+----------------+
5 rows in set (0.001 sec)

MariaDB [hello]> alter table stu_test modify name varchar(60);
Query OK, 0 rows affected (0.013 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+----------------+
| Field  | Type         | Null | Key | Default            | Extra          |
+--------+--------------+------+-----+--------------------+----------------+
| id     | int(11)      | NO   | PRI | NULL               | auto_increment |
| name   | varchar(60)  | YES  |     | NULL               |                |
| age    | int(11)      | YES  |     | NULL               |                |
| score  | decimal(4,2) | YES  |     | NULL               |                |
| avatar | varchar(100) | NO   |     | default-avatar.png |                |
+--------+--------------+------+-----+--------------------+----------------+
5 rows in set (0.001 sec)

因为是增加字段的长度,所以也不影响已有数据

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
|  2 | 小图图    |    5 | 72.80 | default-avatar.png |
|  3 | 大司马    |   42 | 87.30 | default-avatar.png |
|  4 | 乐迪      |   32 | 99.00 | default-avatar.png |
|  5 | dc872458  |   25 |  NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.000 sec)

如果是减小字段长度,就需要确认已有数据是否有超过新长度的内容了!比如从60减小到30,那么长度为40的数据就会出现错误!

那如果是将varchar直接改成int,或者将int改成char,会发生什么呢?

表中的id字段是一个int,尝试将其修改成char

alter table stu_test modify id varchar(32);
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
| 2  | 小图图    |    5 | 72.80 | default-avatar.png |
| 3  | 大司马    |   42 | 87.30 | default-avatar.png |
| 4  | 乐迪      |   32 | 99.00 | default-avatar.png |
| 5  | dc872458  |   25 |  NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.001 sec)

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field  | Type         | Null | Key | Default            | Extra |
+--------+--------------+------+-----+--------------------+-------+
| id     | varchar(32)  | NO   | PRI | NULL               |       |
| name   | varchar(60)  | YES  |     | NULL               |       |
| age    | int(11)      | YES  |     | NULL               |       |
| score  | decimal(4,2) | YES  |     | NULL               |       |
| avatar | varchar(100) | NO   |     | default-avatar.png |       |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.002 sec)

可以看到,其不仅成功变成了字符串类型,已有的值也没有出错。毕竟int数字改成字符串是可行的。那反过来呢?

MariaDB [hello]> insert into stu_test (id,name,age,score,avatar) values ('kb','你好',30,60,'测试图片.png');
Query OK, 1 row affected (0.007 sec)

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
| 2  | 小图图    |    5 | 72.80 | default-avatar.png |
| 3  | 大司马    |   42 | 87.30 | default-avatar.png |
| 4  | 乐迪      |   32 | 99.00 | default-avatar.png |
| 5  | dc872458  |   25 |  NULL | default-avatar.png |
| kb | 你好      |   30 | 60.00 | 测试图片.png       |
+----+-----------+------+-------+--------------------+
5 rows in set (0.000 sec)

此时我往表中插入了一个id为kb的数据,再尝试将id从varchar改回int类型

MariaDB [hello]> alter table stu_test modify id int;
ERROR 1292 (22007): Truncated incorrect INTEGER value: 'kb'
MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field  | Type         | Null | Key | Default            | Extra |
+--------+--------------+------+-----+--------------------+-------+
| id     | varchar(32)  | NO   | PRI | NULL               |       |
| name   | varchar(60)  | YES  |     | NULL               |       |
| age    | int(11)      | YES  |     | NULL               |       |
| score  | decimal(4,2) | YES  |     | NULL               |       |
| avatar | varchar(100) | NO   |     | default-avatar.png |       |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.001 sec)

此时就会报错,kb不符合int类型;修改失败了!

所以,修改字段的类型,需要保证原有类型和目标类型之间是可以正常双向转换的!

2.5.4 修改字段名字

如下使用change修改字段id -> num,同时还需要注明属性(也可以修改属性)

alter table stu_test change id num varchar(32);

这里可以看到 0 rows affected,因为我们修改的是字段名字而已,所以不会影响到数据

MariaDB [hello]> alter table stu_test change id num varchar(32);
Query OK, 0 rows affected (0.008 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field  | Type         | Null | Key | Default            | Extra |
+--------+--------------+------+-----+--------------------+-------+
| num    | varchar(32)  | NO   | PRI | NULL               |       |
| name   | varchar(60)  | YES  |     | NULL               |       |
| age    | int(11)      | YES  |     | NULL               |       |
| score  | decimal(4,2) | YES  |     | NULL               |       |
| avatar | varchar(100) | NO   |     | default-avatar.png |       |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.001 sec)

2.6 修改表名

alter table stu_test rename stu;

可以看到修改成功了

MariaDB [hello]> alter table stu_test rename stu;
Query OK, 0 rows affected (0.015 sec)

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| stu             |
| tb_video        |
+-----------------+
2 rows in set (0.000 sec)

3.数据

3.1 插入

往刚刚创建的students表里面插入两个数据

 insert into student (name,age) value ('牛爷爷',50);
 insert into student (name,age) value ('图图',9);

查看表中数据

select * from student;
+-----------+------+
| name      | age  |
+-----------+------+
| 牛爷爷    |   50 |
| 图图      |    9 |
+-----------+------+
2 rows in set (0.001 sec)

3.2 查看表中已有值

select * from  student;

该语句作用为查看student表中的所有值

MariaDB [test_bin]> select * from  student;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.001 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QQ聊天界面-计算Frame Objective-C语言】

一、计算frame 1.我还是先把之前的代码保存一份, 我们刚才在第一份代码里面,其实无非就是 1)创建了个模型, 2)懒加载 3)把界面拖了一下 4)创建了一个自定义Cell 是不是就做了这四件事儿 2.那么,接下来,我们是不是要计算坐标了, 好,找到我们这个frame,在这个…

黑客松必备|如何快速注册参与Bear Necessities Hackathon

由Moonbeam和AWS Startups联合主办的Bear Necessities Hackathon黑客松提供了一个有趣且竞争、同时还有奖励的环境以供构建者们探索Moonbeam的互操作功能和创建跨链应用。本次黑客松由Moonbeam基金会、Chainlink、StellaSwap、SubQuery、Biconomy提供赞助,包含6个挑…

chatgpt赋能python:Python中Input函数的使用方法

Python中Input函数的使用方法 Python中的input()函数是一个内置函数,它可以用来从用户那里获取输入。它可以在编写Python程序时,和常量和变量一起使用。在本文中,我们将介绍Python中input()函数的使用方法。 什么是Input函数? …

Netty的高性能之道

1.背景 最近看到gitHub上有一个开源项目,通过使用 Netty4 Thrift 压缩二进制编解码技术,他们实现了 10W TPS(1K 的复杂 POJO 对象)的跨节点远程服务调用。相比于传统基于 Java 序列化 BIO(同步阻塞 IO)的…

docker harbor 私有仓库

docker 的本地自带的私有仓库 安装本地私有仓库的镜像 docker pull registry 下载镜像 vim /etc/docker/daemon.json 配置配置文件 也可以只写第一个也行 { "insecure-registries": ["192.168.86.50:5000"] } systemctl restart docker 重…

问题总结!常用插件Pytest的测试用例的一些问题

目录 前言: 失败重跑 Pytest-rerunfailures 用例执行顺序 Pytest-ordering 重复执行 Pytest-repeat 多重断言 Pytest-assume 前言: Pytest是Python中的一个流行的测试框架,它提供了许多功能强大的插件来支持自动化测试。 失败重跑 Pyt…

第1讲:XMLHttpRequest详解(ajax基础)

XMLHTTPRequest对象 XMLHTTPRequest对象,是基于XML的HTTP请求。XMLHTTPRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通讯。自从浏览器提供了XMLHTTPRequest这个接口之后,ajax操作就此诞生。 AJAX Asynchronous JavaScript and X…

Exploit/CVE-2010-0738

打开JBoss的潘多拉魔盒:JBoss高危漏洞分析 *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。 前言 JBoss是一个基于J2EE的开放源代码应用服务器&#xff0…

盖雅工场联合福达企业资源系統 (DynaSys) 成功举办 SAP SuccessFactors Day 活动

2023年5月31日,由DynaSys主办、盖雅工场协办的SAP SuccessFactors Day活动在香港半岛酒店成功举行。本次活动旨在为在港企业分享员工体验和劳动力管理解决方案,并以行业标杆案例为指引,帮助企业客户在全球市场中更好地制定人力资源管理策略。…

Linux下socket网络编程实战思考

socket网络编程是每个服务端开发人员必会技能,但是目前市面上各种web服务器容器,屏蔽了很多底层实现,导致很多socket通信细节被屏蔽,本文结合在linux下C语言socket通信说明一下网络通信的一些注意点。 目录 1.多进程模型tcp服务…

Windows11安装mysql8.0.32步骤

1、下载mysql安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 2、添加配置文件 mysql安装文件目录下新建一个文件名:my.inimy.ini文件中复制如下内容: [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 ---这里输入你安装…

Linux中的C/C++语言调试工具 GDB

Linux中的C/C语言调试工具 GDB GDB(GNU Debugger)是一个功能强大的调试器,用于调试和分析程序的执行过程。它是GNU项目的一部分,可以在多个操作系统上使用,包括Linux、Unix和Windows。 GDB主要用于调试编译后的可执行…

大模型扎堆「赶考」,语文还是国产AI行,文言文能力超过95%考生

量子位 | 公众号 QbitAI ChatGPT诞生后的第一场全国高考,考生忙,大模型们也很忙。 这不,高考还没结束,AI挑战高考题就成了刷屏热搜话题,各家大模型都被拉出来写起了高考作文,甚至是参与整场考试。 &#…

【MySQL事务】保证数据完整性的利器

1、事务的认识 事务:事务就是将多个SQL给打包在一起,组成一个整体。组成这个整体的各个SQL,要么全部成功,要么全部失败。 举例说明: 情人节到了,滑稽老铁打算给他女朋友小美发给红包,但是他又害…

msvcp140.dll重新安装的解决方法(一键安装方法)

msvcp140.dll电脑文件中的dll文件,即动态链接库文件,若计算机中丢失了某个dll文件,就会导致某些软件和游戏等程序无法正常启动运行,并且导致电脑系统弹窗报错,其安装方法:1、打开浏览器输入“【dll修复程序…

[Diffusion] Speed is all your need

论文简要总结 刚读了下speed is all you need这个论文, https://arxiv.org/pdf/2304.11267.pdf 只是用的SD1.4没有对网络进行改造。 只做了4个改动 1 是对norm采用了groupnorm (GPU shader加速) 2 采用了GELU (GPU shader加速) 3 采用了两种attention优化,是partiti…

一个简单的MCU内存管理模块(附源码)

现在非常多的的MCU性能都还不错,同时用户也会去扩展一些外部RAM,那么如何高效便捷的管理这些内存是一个重要话题。 今天给大家分享一份源码:基于无操作系统的STM32单片机开发,功能强大,可申请到地址空间连续的不同大小…

如何应对公民开发者的挑战?低代码流程自动化助你打造高效系统

如今,企业越来越倾向于采用公民开发作为提升流程自动化和数字化转型的手段。这种方法让非程序员(如客户和员工),有机会为特定任务创建自己的应用程序。它还使公司能够快速调整以适应客户偏好或业务需求。 尽管这种方法有很多好处&…

Prometheus+Grafana普罗米修斯搭建+监控MySQL

PrometheusGrafana普罗米修斯搭建监控MySQL 一,Prometheus 1.什么是Prometheus? ​ Prometheus 是 Cloud Native Computing Foundation 的一个监控系统项目, 集采集、监控、报警等特点于一体。 ​ Prometheus主要受启发于Google的Brogmon监控系统&…

数字化转型浪潮下,汽车零部件企业如何逐鹿突围?

一、汽车行业当下趋势 数据来源:汽车工业协会 1.乘用车及新能源车市场:2023年1-4月,乘用车销量同比增长6.8%,新能源车销量同比增长35.8%。 2.行业趋势:汽车行业生存压力大,4月中国汽车经销商库存系数下降…