MySQL创建、修改和删除表操作指南
来源:脚本之家
时间:2022-12-30 16:01:49 189浏览 收藏
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《MySQL创建、修改和删除表操作指南》,介绍一下删除、MySQL创建,希望对大家的知识积累有所帮助,助力实战开发!
一、创建表
创建表是指在已存在的数据库中建立新表。这是建立数据库最重要的一步,是进行其他表操作的基础。
1、创建表的语法形式
MySQL中,创建表是通过SQL语句CREATE TABLE实现的。其语法格式如下:
create table 表名(属性名 数据类型 [完整性约束条件],
属性名 数据类型 [完整性约束条件],
...
);
其中,“表名”参数表示所要创建的表的名称;“属性名”参数表示表中字段的名称;“数据类型”参数指定字段的数据类型,“完整性约束条件”参数指定字段的某些特殊约束条件。
2、设置表的主键
主键是表的一个特殊字段。该字段能唯一地标识该表中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来标识每个记录,每个记录的主键值都不同。身份证是用来标明人的身份,每个人都具有唯一的身份证号。设置表的主键指在创建表时设置表的某个字段为该表的主键。
主键的主要目的是帮助MySQL以最快的速度查找到表中的某一个条信息。主键必须满足的条件就是主键必须是唯一的,表中任意两条记录的主键字段的值不能相同;主键的值是非空值。主键可以是单一的字段,也可以是多个字段的组合。
1、单字段主键
主键是由一个字段构成时,可以直接在该字段的后面加上PRIMARY KEY来设置主键。语法规则如下:
属性名 数据类型 PRIMARY KEY
其中,“属性名”参数表示表中字段的名称;“数据类型”参数指定字段的数据类型。
下面在example1表中设置stu_id作为主键,SQL代码如下:
create table example1( stu_id int PRIMARY KEY, stu_name VARCHAR(20), stu_sex boolean );
运行创建语句后,example1表中包含3个字段。stu_id字段是整型;stu_name字段是字符串型;stu_sex是布尔型。其中,stu_id字段是主键。
2、多字段主键
主键是由多个属性组合而成时,在属性定义完之后统一设置主键。语法规则如下:
primary key(属性名1,属性名2,...属性名n)
3、设置表的外键
外键是表的一个特殊字段。如果字段sno是一个表A的属性,且依赖于表B的主键。那么,称表B为父表,表A为子表,sno为表A的外键。通过sno字段将父表B和子表A建立关联关系。设置表的外键指在创建表设置某个字段为外键。
设置外键的原则就是必须依赖于数据库中已存在的父表的主键;外键可以为空值。
外键的作用是建立该表与其父表的关联关系。父表中删除某条信息时,子表中与之对应的信息也必须有相应的改变。例如,stu_id是student表的主键,stu_id是grade表的外键。当stu_id为“123”同学退学了,需要从student表中删除该学生的信息。那么,grade表中stu_id为“123”的所有信息也应该同时删除。这样可以保证信息的完整性。
设置外键的基本语法规则如下:
constraint 外键别名 foreign key (属性1.1,属性1.2,...,属性1.n)
references 表名(属性2.1,属性2.2,...,属性2.n)
其中,“外键别名”参数是为外键的代号;“属性1”参数列表是子表中设置的外键;“表名”参数是指父表的名称;“属性2”参数列表是父表的主键。
4、设置表的非空约束
非空性是指字段的值不能为空值(NULL)。非空约束将保证所有记录中该字段都有值。如果用户新插入的记录中,该字段为空值,则数据库系统会报错。例如,在id字段加上非空约束,id字段的值就不能为空值。如果插入记录的id字段的值为空,该记录将不能插入。设置表的非空约束是指在创建表时为表的某些特殊字段加上NOT NULL约束条件。
设置非空约束的基本语法规则如下:
属性名 数据类型 NOT NULL
下面在example4表中设置字段id和name的非空约束。SQL代码如下:
create table example4( id int not null primary key, name varchar(20) not null, stu_id int, constraint d_fk foreign key (stu_id) references example1(stu_id) );
代码运行后,example4表中包含3个字段。其中,id字段为主键;id和name字段为非空字段,这两个字段的值不能为空值(NULL);stu_id字段为外键;d_fk为外键的别名;example1表为example4表的父表;example4的外键依赖于父表的主键stu_id。
5、设置表的唯一性约束
唯一性是指所有记录中该字段的值不能重复出现。设置表的唯一性约束是指在创建表时,为表的某些特殊字段加上UNIQUE约束条件。唯一性约束将保证所有记录中该字段的值不能重复出现。例如,在id字段加上唯一性约束,所以记录中id字段上不能出现相同的值。例如,在表的id字段加上唯一性约束,那么每条记录的id值都是唯一的,不能出现重复的情况。如果一条的记录的id为‘0001’,那么该表中就不能出现另一条记录的id为‘0001’。设置唯一性约束的基本语法规则如下:
属性名 数据类型 UNIQUE
6、设置表的属性值自动增加
AUTO_INCREMENT是MySQL数据库中一个特殊的约束条件。其主要用于为表中插入的新记录自动生成唯一的ID。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLINT、INT和BIGINT等)。默认情况下,该字段的值是从1开始自增。
设置属性值字段增加的基本语法规则如下:
属性名 数据类型 AUTO_INCREMENT
下面在example6表中设置字段id的值自动增加。SQL代码如下:
create table example6( id int primary key auto_increment, stu_id int unique, name varchar(20) not null );
代码运行后,example6表中包含3个字段。其中,id字段为主键,且每插入一条新记录id的值会自动增加;stu_id字段为唯一值,该字段的值不能重复;name字段为非空字段,该字段的值不能为空值(NULL)。
在插入记录时,默认的情况下自增字段的值从1开始自增。例如,example6表中的id字段被设置成自动增加,默认情况第一条记录的id值为1。以后每增加一条记录,该记录的id值都会在前一条记录的基础上加1。
如果第一条记录设置了该字段的初值,那么新增加的记录就从初值开始自增。例如,如果example6表中插入的第一条记录的id值设置为8,那么再插入记录的id值就会从8开始往上增加。
7、设置表的属性的默认值
在创建表时可以指定表中的字段的默认值。如果插入一条新的记录时没有为这个字段赋值,那么数据库系统会自动为这个字段插入默认值。默认值是通过DEFAULT关键字来设置的。设置默认值的基本语法规则如下:
属性名 数据类型 DEFAULT 默认值
下面在example7表中设置字段id的值自动增加。SQL代码如下:
create table example7( id int primary key auto_increment, stu_id int unique, name varchar(20) not null, English varchar(20) default 'zero', Math float default 0, Computer float default 0 );
代码运行后,example7表中包含6个字段。其中,id字段为主键,且每插入一条新记录id的值会自动增加;stu_id字段为唯一值,该字段的值不能重复;name字段为非空字段,该字段的值不能为空值(NULL);English字段的默认值为zero;Math字段和Computer字段的默认值为0。如果没有使用DEFAULT关键字指定字段的默认值,也没有指定字段为非空,那么字段的默认值为空(NULL)。
二、查看表结构
查看表结构是指查看数据库中已存在的表的定义。查看表结构的语句包括DESCRIBE语句和SHOW CREATE TABLE语句。通过这两个语句,可以查看表的字段名、字段的数据类型和完整性约束条件等。
1、查看表基本结构语句DESCRIBE
MySQL中,DESCRIBE语句可以查看表的基本定义。其中包括,字段名、字段数据类型、是否为主键和默认值等。DESCRIBE语句的语法形式如下:
DESCRIBE 表名;
其中,“表名”参数指所要查看的表的名称。
下面用DESCRIBE语句查看example1表的定义,代码如下:
DESCRIBE example1;
通过DESCRIBE语句,可以查出example1表包含stu_id、stu_name和stu_sex字段。同时,结果中显示了字段的数据类型(Type)、是否为空(Null)、是否为主外键(Key)、默认值(Default)和额外信息(Extra)。
DESCRIBE可以缩写成DESC。
下面直接使用DESC查看example1表的结构。代码如下:
DESC example1;
2、查看表详细结构语句SHOW CREATE TABLE
MySQL中,SHOW CREATE TABLE语句可以查看表的详细定义。该语句可以查看表的字段名、字段的数据类型、完整性约束条件等信息。除此之外,还可以查看表默认的存储引擎和字符编码。SHOW CREATE TABLE语句的语法形式如下:
show create table 表名;
其中,“表名”参数指所要查看的表的名称。
下面是用SHOW CREATE TABLE语句查看example1表的定义,代码如下:
show create table example1
三、修改表
修改表是指修改数据库中已存在的表的定义。修改表比重新定义表简单,不需要重新加载数据,也不会影响正在进行的服务。MySQL中通过ALTER TABLE语句来修改表。修改表包括修改表名、修改字段数据类型、修改字段名、增加字段、删除字段、修改字段的排列位置、更改默认存储引擎和删除表的外键约束等。
1、修改表名
表名可以在一个数据库中唯一的确定一张表。数据库系统通过表名来区分不同的表。例如,数据库school中有student表。那么,student表就是唯一的。在数据库school中不可能存在另一个名为student的表。MySQL中,修改表名是通过SQL语句ALTER TABLE实现的。其语法形式如下:
ALTER TABLE 旧表名 RENAME [TO] 新表名;
其中,“旧表名”参数表示修改前的表名:“新表名”参数表示修改后的新表名;TO参数是可选参数,其是否在语句中出现不会影响语句的执行。
下面是将example0改名为user表,SQL代码如下;
alter table example0 rename user;
2、修改字段的数据类型
字段的数据类型包括整数类型、浮点数型、字符串型、二进制类型、日期和时间类型等。数据类型决定了数据的存储格式、约束条件和有效范围。表中的每个字段都有数据类型。MySQL中,ALTER TABLE语句也可以修改字段的数据类型。其基本语法如下:
ALTER TABLE 表名 MODIFY 属性名 数据类型;
其中,“表名”参数指所要修改的表的名称;“属性名”参数指需要修改的字段的名称;“数据类型”参数指修改后的新数据类型。
下面将修改user表中name字段的数据类型。SQL代码如下:
alter table user MODIFY name varchar(30)
代码运行成功后查看user的表的结构。
我们发现表的类型长度已经变了。
3、修改字段名
字段名可以在一张表中唯一的确定一个字段。数据库系统通过字段名来区分表中的不同字段。例如,student表中包含id字段。那么,id字段在student表中是唯一的。student表中不可能存在另一个名为“id”的字段。MySQL中,ALTER TABLE语句也可以修改表的字段名。其基本语法如下:
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;
其中,“旧属性名”参数指修改前的字段名;“新属性名”参数指修改后的字段名;“新参数类型”参数修改后的数据类型,如不需要修改,则将新数据类型设置成与原来一样。
1、只修改字段名
使用ALTER TABLE语句可以直接修改字段名,不改变该字段的数据类型。
下面将example1表中stu_name字段改名为name,且不改变数据类型。由于不改变该字段的数据类型,需要知道该字段现在的数据类型。
在执行ALTER TABLE语句之前,先用DESC语句查看example1表的结构。其中可以看到example1表中存在stu_name字段,以便与修改后进行对比。并且可以知道stu_name字段现在的数据类型。desc语句执行后的显示结果如下:
从查询结果可以看出,example1表中存在stu_name字段,且数据类型为varchar(20)。修改example1表中字段的SQL代码如下:
alter table example1 change stu_name name varchar(20);
代码执行完毕后,验证一下是否已经修改了属性的名字,使用desc语句重新查看。
查询结果显示,example1表中已经不存在stu_name字段,取而代之的是name字段。而且,字段的数据类型没有发生改变。
2、修改字段名称和字段数据类型
使用ALTER TABLE语句可以直接修改字段名和该字段的数据类型。
下面将example1表中stu_sex字段改名为sex,且数据类型改为INT(2)。SQL代码如下:
alter table example1 change stu_sex sex int(2)
我们查看是否修改成功:
从查询结果可以看出,我们已经修改成功了。
4、增加字段
在创建表时,表中的字段就已经定义完成。如果要增加新的字段,可以通过ALTER TABLE语句进行增加。在MySQL中,ALTER TABLE语句增加字段的基本语法如下:
alter table 表名 add 属性名1 数据类型 [完整性约束条件] [FIRST | AFTER 属性名2];
其中,“属性名1”参数指需要增加的字段的名称;“数据类型”参数指新增加字段的数据类型;“完整性约束条件”是可选参数,用来设置新增字段的完整性约束条件;“FIRST”参数也是可选参数,其作用是将新增字段添加到“属性名2”所指的字段后。如果执行的SQL语句中没有“FIRST” “AFTER 属性名2”参数指定新增字段的位置,新增的字段默认为表的最后一个字段。
1、增加无完整性约束条件的字段
一个完整的字段包括字段名、数据类型和完整性约束条件。增加字段一般包括上述内容。根据实际情况,一些字段可以不用完整性约束条件进行约束。
下面将在user表中增加一个没有完整性约束条件约束的phone字段。SQL代码如下:
alter table user add phone varchar(20);
使用desc语句查看一下是否添加成功。
2、增加有完整性约束条件的字段
增加字段时可以设置该字段的完整性约束条件,如设置字段是否为空(Null)、是否为主外键(Key)、默认值(Default)和是否为自增类型等约束条件。
下面将在user表中增加一个有非空约束的age字段,SQL代码如下;
alter table user add age int(4) not null;
使用desc查询是否增加成功。
3、表的第一个位置增加字段
默认情况下,新增字段为表的最后一个字段。如果加上FIRST参数,则可以将新增字段设置为表的第一个字段。
下面将在user表中第一个位置增加num字段,并设置num字段为主键。SQL代码如下:
alter table user add num int(8) primary key first;
我们使用desc查看是否添加成功。
可以看到添加成功。
4、表的指定位置之后增加字段
在增加字段时,由于特殊原因需要在表的指定位置增加字段。如果加上“AFITER 属性名2”参数,那么新增的字段插入在“属性名2”后面。
下面将在user表的phone字段后增加address字段,并设置address字段为非空。SQL代码如下:
alter table user add address varchar(30) not null after phone;
我们使用desc来查看是否添加属性正确。
我们看到确实属性添加到指定位置了。
5、删除字段
删除字段是指删除已经定义好的表中的某个字段。在表创建完之后,如果发现某个字段需要删除,可以采用将整个表都删除,然后重新创建一张表的做法。这样做是可以达到目的,但必然会影响到表中的数据。而且,操作比较麻烦。MySQL中,ALTER TABLE语句也可以删除表中的字段。其基本语法如下:
alter table 表名 drop 属性名;
其中,“属性名”参数指需要从表中删除的字段的名称。
下面将从user表中删除id字段。SQL代码如下:
alter table user drop id;
我们使用desc来查看是否删除成功。
我们可以看到没有了id属性了。
6、修改字段的排列位置
创建表的时候,字段在表中的排列位置就已经确定了。如果要改变字段在表中的排列位置,则需要ALTER TABLE语句来处理。MySQL中,修改字段排列位置的ALTER TABLE语句的基本语法如下:
alter table 表名 modify 属性名1 数据类型 first | after 属性名2;
其中,“属性名1”参数指需要修改位置的字段的名称:“数据类型”参数指“属性名1”的数据类型;“first”参数指定位置为表的第一个位置;“after 属性名2”参数指定“属性名1”插入在“属性名2”之后。
1、字段修改到第一个位置
FIRST参数可以指定字段为表的第一个字段。
下面将user表中name字段修改为该表的第一个字段。SQL代码如下:
alter table user modify name varchar(30) first;
使用desc查看一下是否修改成功。
我们可以看到name已经到第一个字段了。
2、字段修改到指定位置
“AFTER”参数可以将字段排在表中指定的字段之后。
下面将user表中sex字段修改到age字段之后,SQL代码如下:
alter table user modify sex tinyint(1) after age;
我们通过desc来查看是否修改成功
我们可以看到已经修改成功。
7、更改表的存储引擎
MySQL存储引擎是指MySQL数据库中表的存储类型。MySQL存储引擎包括InnoDB、MyISAM、MEMORY等。不同的表类型有着不同的优缺点,在创建表时,存储引擎就已经设定好了。如果要改变,可以通过重新常见一张表来实现。这样做是可以达到目的,但必然会影响到表中的数据。而且,操作比较麻烦。MySQL中,ALTER TABLE语句也可以更改表的存储引擎的类型。其基本语法如下:
ALTER TABLE 表名 ENGINE=存储引擎名;
其中,“存储引擎名”参数指设置的新存储引擎的名称。
下面将user表的存储引擎改为MyISAM,SQL代码如下:
alter table user engine=MyISAM;
我们使用show create table语句查看一下是否修改成功。
可以看到已经修改成功。
8、删除表的外键约束
外键是一个特殊字段,其将某一表与其父表建立关联关系。在创建表的时候,外键约束就已经设定好了。由于特殊需要,与父表之间的关联关系需要去除,要求删除外键约束。MySQL中,ALTER TABLE 语句也可以删除表的外键约束。其基本语法如下:
alter table 表名 drop foreign key 外键别名;
其中,“外键别名”参数指创建表时设置的外键的代号。
四、删除表
删除表是指删除数据库中已存在的表。删除表时,会删除表中的所有数据。因此,在删除表时要特别注意。MySQL中通过DROP TABLE语句来删除表。由于创建表时可能存在外键约束,一些表成为了与之关联的表的父表。要删除这些父表,情况比较复杂。
1、删除没有被关联的普通表
MySQL中,直接使用drop table语句可以删除没有被其他关联的普通表。其基本语法如下:
drop table 表名;
其中,“表名”参数为要删除的表的名称。
下面将删除example5表。SQL代码如下:
drop table example5;
2、删除被其他表关联的父表
下面我们要删除example1表。SQL代码如下:
drop table example1;
可以看到删除结果失败,原因为有外键依赖于该表。因为example4表依赖于example1表。example4表的外键stu_id依赖于example1表的主键。example1表是example4表的父表。如果要删除example4表,必须先去掉这种依赖关系。最简单直接的办法是,先删除子表example4,然后再删除父表example1。但这样可能会影响子表的其他数据;另一种办法是,先删除子表的外键约束,然后再删除父表。这种办法,不会影响子表的其他数据,可以保证数据库的安全。
首先,删除example4表的外键约束。先用show create table语句查看example4表的外键别名,执行如下:
查询结果显示,example4表的外键别名为d_fk。然后执行alter table语句,删除example4表的外键约束。删除example4表的外键的SQL语句如下:
alter table example4 drop foreign key d_fk;
现在我们再次查看example4表中还有没有外键约束。
可以看到已经没有外键约束了。
现在,可以直接使用drop table语句删除example1表。SQL代码如下:
drop table example1;
补充:MySQL 常用字段类型
一个数据表是由若干个字段组成的,一个表十几个字段也很正常,每个字段表示不同的信息,需要使用不同类型的数据。
所以在创建表的时候,要为每个字段指定适合的数据类型。
MySQL 中常用的字段类型有以下这些:
1. 整数类型
数据类型 | 数据范围 |
TINYINT | -128 -- 127 |
SMALLINT | -32768 -- 32767 |
MEDIUMINT | -2^23 -- 2^23-1 |
INT | -2^31 -- 2^31-1 |
BIGINT | -2^63 -- 2^63-1 |
2. 字符串类型
数据类型 | 字节范围 | 用途 |
CHAR(n) | 0 -- 255字节 | 定长字符串 |
VARCHAR(n) | 0 -- 65535字节 | 变长字符串 |
TEXT | 0 -- 65535字节 | 长文本数据 |
LONGTEXT | 0 -- 2^32-1字节 | 极大文本数据 |
BLOB | 0 -- 65535字节 | 二进制长文本数据 |
LONGBLOB | 0 -- 2^32-1字节 | 二进制极大文本数据 |
3. 小数类型
m 表示浮点数的总长度,n 表示小数点后有效位数。
数据类型 | 数据用法 | 数据范围 |
Float | Float(m,n) | 7位有效数 |
Double | Double(m,n) | 15位有效数 |
Decimal | Decimal(m,n) | 28位有效数 |
4. 时间类型
数据类型 | 格式 | 用途 |
DATE | YYYY-MM-DD | 日期 |
TIME | HH:MM:SS | 时间 |
YEAR | YYYY | 年份 |
DATETIME | YYYY-MM-DD HH:MM:SS | 日期和时间 |
TIMESTAMP | 10位或13位整数(秒数) | 时间戳 |
5. 枚举类型
enum(枚举值1,枚举值2,...)
枚举类型只能在列出的值中选择一个,如性别。
五、总结
这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
文中关于mysql的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《MySQL创建、修改和删除表操作指南》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
346 收藏
-
496 收藏
-
253 收藏
-
353 收藏
-
159 收藏
-
227 收藏
-
306 收藏
-
418 收藏
-
339 收藏
-
279 收藏
-
189 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 魁梧的酒窝
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享技术文章!
- 2023-02-04 20:09:05
-
- 自信的小白菜
- 这篇博文太及时了,博主加油!
- 2023-02-02 22:19:00
-
- 香蕉摩托
- 好细啊,已收藏,感谢大佬的这篇文章,我会继续支持!
- 2023-02-02 21:47:34
-
- 独特的红酒
- 太详细了,已收藏,感谢博主的这篇技术文章,我会继续支持!
- 2023-02-02 04:50:26
-
- 感动的果汁
- 这篇文章内容太及时了,细节满满,赞 👍👍,码住,关注作者了!希望作者能多写数据库相关的文章。
- 2023-01-23 03:09:33
-
- 英俊的玉米
- 这篇技术贴真及时,太详细了,感谢大佬分享,已收藏,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-01-15 04:24:38
-
- 靓丽的戒指
- 这篇文章内容太及时了,太全面了,写的不错,已加入收藏夹了,关注作者了!希望作者能多写数据库相关的文章。
- 2023-01-12 08:26:59
-
- 潇洒的世界
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢up主分享博文!
- 2023-01-09 16:58:04
-
- 雪白的发卡
- 这篇博文真及时,很详细,很好,码起来,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-01-05 09:07:41
-
- 冷傲的钢笔
- 这篇技术贴出现的刚刚好,博主加油!
- 2023-01-05 04:09:39