MySQL之表基本操作及重要概念

news2024/11/19 9:35:47

前言

表就相当于文件夹中的excel文件,表中的每一条记录就是excel中的一条记录,字段就是表格的表头,记录就是表格中的每一行数据本文将详细介绍表相关操作、mysql存储引擎、字段数据类型及约束条件等知识。

存储引擎

计算机中存储的文件格式有很多种,针对不同的文件格式会有对应不同的存储方式和处理机制,比如存储pdf格式的文件和txt格式的文件存储机制就是不同的。

对应到MySQL中存储引擎就是不同的存储机制,在创建表时候可以指定存储引擎,可以通过下述SQL语句查看所有的存储引擎:

show engines;

这里只介绍MySQL最常用的四种存储引擎:

Innodb : 是MySQL5.5版本及之后默认的存储引擎 存储数据更加的安全

myisam :是MySQL5.5版本之前默认的存储引擎 速度比Inodb更快,但是我们更加注重的是数据的安全

memory :内存引擎,数据全部存放在内存中,断电数据丢失

blackhole 无论存什么,都立刻消失(黑洞)

创建表

创建表的基本语法如下:

use database;  # 切换到需要创建表的库下
create table 表名(字段1 字段1数据类型(宽度) 约束条件, 字段2 字段2数据类型(宽度) 约束条件...)
复制代码

在同一张表中字段名不能重复,创建表时字段和字段类型是必须的,宽度一般情况下指的是对数据长度的限制,约束条件是在宽度的基础上为字段增加额外的约束,宽度和约束条件是可选的。

下述的SQL语句创建表的过程中,有些操作目前没有介绍,屏幕面前的小伙伴先看着,后续文章都会做详细介绍的。

-- 创建数据库
mysql> create database ex; 
Query OK, 1 row affected (0.00 sec)

-- 切换数据库
mysql> use ex;
Database changed

-- 在数据库内创建表,表名为info,字段分别是id name age sex phone
mysql> create table info(id int, name varchar(20), age int(3), sex enum('male','female'), phone bigint(11));
Query OK, 0 rows affected (0.01 sec)

-- 查看数据库中所有的表
mysql> show tables;
+--------------+
| Tables_in_ex |
+--------------+
| info         |
+--------------+
1 row in set (0.00 sec)

-- 查看info这张表的信息
mysql> desc info;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(20)           | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| phone | bigint(11)            | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
5 rows in set (0.09 sec)

-- 查询info这张表的所有数据
mysql> select * from info;
Empty set (0.00 sec)

表中插入数据

上述查看表中所有数据的操作中,得到的结果empty,这是因为我们虽然创建了表但是表中并没有数据的原因,因此我们需要向表中插入数据,可以一次性插入多条记录,向表中插入数据有两种方式:

第一种,按照字段和值的对应关系插入:

-- 基本语法
insert into 表名 (字段1,字段2...) values (字段1的值, 字段2的值...), (字段1的值, 字段2的值...);

-- 具体操作
mysql> insert into info(id, name, sex, phone) values(1, 'python', 'male', 110), (2, 'java', 'female', 119);  -- 插入两条数据
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

-- 查看表中所有数据,由于age没有插入对应数据,因此为null
mysql> select * from info;  
+------+--------+------+--------+-------+
| id   | name   | age  | sex    | phone |
+------+--------+------+--------+-------+
|    1 | python | NULL | male   |   110 |
|    2 | java   | NULL | female |   119 |
+------+--------+------+--------+-------+
2 rows in set (0.00 sec)

第二种,不指定字段值插入数据,必须按照创建表时的顺序增加数据,同样可以一次插入多条数据;

-- 语法
insert into 表名 values(字段1的值, 字段2的值...);

-- 具体操作
-- 如果没有按照创建表时字段的顺序和数量就会出现数据错乱和报错
mysql> insert into info values (3, 'php', 'male', 114);
ERROR 1136 (21S01): Column count does not match value count at row 1

-- 下述SQL语句就是正确的操作
mysql> insert into info values (3, 'php',10, 'male', 114),(4,'go',5,'male', 120);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from info;
+------+--------+------+--------+-------+
| id   | name   | age  | sex    | phone |
+------+--------+------+--------+-------+
|    1 | python | NULL | male   |   110 |
|    2 | java   | NULL | female |   119 |
|    3 | php    |   10 | male   |   114 |  
|    4 | go     |    5 | male   |   120 |
+------+--------+------+--------+-------+
4 rows in set (0.00 sec)

查看表结构

查看表结构有两种方式,分别是descshow create table。上述SQL语句中我们使用的就是desc 表名查看表结构,但是输出的信息还不够全面,为了得到更全面的表定义信息,有时候就需要查看创建表的SQL语句,使用show create table语法。除了可以看到表定义之外,还可以看到engine(存储引擎)和charset(字符集)等信息。

-- desc查看表结构,也可以使用describe,desc是descride的简写,效果相同
mysql> desc info;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(20)           | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| phone | bigint(11)            | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
5 rows in set (0.94 sec)

mysql> describe info;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(20)           | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| phone | bigint(11)            | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
5 rows in set (0.08 sec)

下面在使用show create table的方式查看一下表结构:

-- \G选项的含义是是的记录能够竖向排列,以便更好的显示内容较长的记录。
mysql> show create table info \G;  
*************************** 1. row ***************************
       Table: info
Create Table: CREATE TABLE `info` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `sex` enum('male','female') DEFAULT NULL,
  `phone` bigint(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR:
No query specified

数据类型

MySQL支持所有标准的SQL数值数据类型,大概可以分为以下几类,这些类型是创建表时指定的字段的数据类型。

整数类型

MySQL支持的整数类型有TINYINT、MEDIUMINT和BIGINT;对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在MySQL中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

下表中显示了每种数字类型的存储和范围以及大致用途:

类型大小范围(有符号)范围(无符号)unsigned约束用途
TINYINT1 字节(-128,127)(0,255)小整数值
SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 字节(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值

TINYINT:

默认情况下带正负号,如果存储的数值超过该类型可接受的范围默认存储最大可接受数值

mysql> create table t(id int, num tinyint);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t values(1, -129), (2, -100), (3, 100), (4, 128);
Query OK, 4 rows affected, 2 warnings (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 2

-- 数据超过该数据类型范围时就只能存储支持的最大接收数值
mysql> select * from t;
+------+------+
| id   | num  |
+------+------+
|    1 |  128 |
|    2 |  100 |
|    3 |  100 |
|    4 |  127 |
+------+------+
4 rows in set (0.00 sec)

如果不想存入负数的话可以使用 unsigned 约束条件,只能存储正数;

mysql> create table t1(id int, num tinyint unsigned);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(1, -129), (2, -100),(3,100),(4, 128);
Query OK, 4 rows affected, 2 warnings (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 2

mysql> desc t1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | int(11)             | YES  |     | NULL    |       |
| num   | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> select * from t1;
+------+------+
| id   | num  |
+------+------+
|    1 |    0 |
|    2 |    0 |
|    3 |  100 |
|    4 |  128 |
+------+------+
4 rows in set (0.00 sec)

INT

默认也是带有正负号,可以通过unsigned约束条件限制只存储正数:

mysql> create table t2(id int(8));
Query OK, 0 rows affected (0.01 sec)

在介绍创建表的语法时介绍在数据类型后的小括号中的数字表示宽度,针对其他类型来讲宽度就是字符的长度,但是对整形来讲宽度指的是字节数,比如上述创建表时定义int(8)如果数字没有超出8位,默认用空格填充至8位,如果数字超出了8位,那么有几位就存几位(但是还是要遵循最大范围)

mysql> create table t2(id int(8));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t2 values(123), (123456789);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t2;
+-----------+
| id        |
+-----------+
|       123 |
| 123456789 |
+-----------+
2 rows in set (0.00 sec)

使用空格填充的方式不是很方便看出是否被填充,我们可以使用zerofill约束条件,用0进行填充:

mysql> create table t3(id int(8) zerofill);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t3 values(1),(123456789);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t3;
+-----------+
| id        |
+-----------+
|  00000001 |
| 123456789 |
+-----------+
2 rows in set (0.00 sec)

总结来说,针对整形字段括号内无需指定宽度,因为默认的宽度以及足够显示所有的数据了。

小数类型

对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在MySQL中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

# 存储限制
float(255,30)# 总共255位,小数部分占30位
duble(255,30)# 总共255位,小数部分占30位
decimal(65,30)# 总共65位,小数部分占30位


# 精确度验证
create table t(id float(255,30));
create table t(id double(255,30));
create table t(id decimal(65,30));

insert into t values(1.1111111111111111);

# 精确度比较,结合实际应用场景,看情况
float<double<decimal

字符类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT。这里介绍CHAR和VARCHAR两种,这两种类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65 535字节二进制形式的长文本数据
TEXT0-65 535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据

CHAR列的长度固定为创建表是声明的长度,范围(0-255),而VARCHAR的值是可变长字符串范围(0-65535)。

mysql> create table t4 (v varchar(4),c char(4));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t4 values ('ab  ','ab  ');
Query OK, 1 row affected (0.00 sec)

# 在检索的时候char数据类型会去掉空格
mysql> select * from t4;
+------+------+
| v    | c    |
+------+------+
| ab   | ab   |
+------+------+
row in set (0.00 sec)

# 对查询结果计算长度
mysql> select length(v),length(c) from t4;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
|         4 |         2 |
+-----------+-----------+
row in set (0.00 sec)

# 当存储的长度超出定义的长度,会截断
mysql> insert into t4 values ('abcd  ','abcd  ');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from t4;
+------+------+
| v    | c    |
+------+------+
| ab   | ab   |
| abcd | abcd |
+------+------+
rows in set (0.00 sec)

日期类型

表示时间值的日期和时间类型为DATETIME、DATE、TIME和YEAR。每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

date/time/datetime

mysql> create table t4 (d date,t time,dt datetime);
Query OK, 0 rows affected (0.02 sec)

mysql> desc t4;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
rows in set (0.01 sec)

mysql> insert into t4 values (now(),now(),now());  -- now()表示现在的时间
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from t4;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2021-06-15 | 14:31:21 | 2021-06-15 14:31:21 |
+------------+----------+---------------------+
row in set (0.00 sec)

枚举与集合类型

ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。ENUM只允许从值集合中选取单个值,而不能一次取多个值也不能插入枚举中没有的值。简而言之就是多选一

SET和ENUM非常相似,set类型可以允许值集合中任意选择1或多个元素进行组合。对不属于集合的内容将不允许插入数据,而对重复的值将进行自动去重。是多选多

枚举和集合在创建表的时候都可以使用default指定默认值,当然也可以不指定。

-- 枚举字段:后期在存数据的时候只能从枚举里面选择一个存储
create table user(
	id int,
    name char(16),
    gender enum('male','female','other') default 'other'

);
insert into user values(1,'jason','male');
insert into user valuses(2,'egon','xxxooo') # 报错


-- 集合:可以只选一个,也可以选多个,但是不能写没有列举的
create table teacher(
	id int,
    name char(16),
    gender enum('male','female','others'),
    hobby set('read','hecha')
)
insert into teacher values(1,'python','male','read,hecha');
insert into teacher values(2,'java','others','生蚝'); # 报错

约束条件

约束条件是创建表时可选的,在上文中介绍了两个约束条件,分别是unsignedzerofill,一个是用来约束数字类型不存负数另一个是使用0进行填充,接下来就来介绍一下其他约束条件。

unique唯一

指定某列或者某几列的组合数据不能重复,即单列唯一和多列联合唯一:

-- 单列唯一,id列插入重复的数据就会报错
mysql> create table t(id int unique, name varchar(4));
Query OK, 0 rows affected (0.10 sec)

mysql> insert into t values(1, 'python'),(2, 'java');
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> insert into t values(1, 'python'),(2, 'java');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'

-- 联合唯一,比如ip和port单个都可以重复,但是加起来必须是唯一的
mysql> create table t(id int unique, ip varchar(12), port varchar(4), unique(ip, port));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t values(1,'127.0.0.1',8080);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t values(2,'127.0.0.1',8081);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t values(3,'127.0.0.2',8080);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t values(4,'127.0.0.1',8080);
ERROR 1062 (23000): Duplicate entry '127.0.0.1-8080' for key 'ip'

not null非空

该约束条件的意思就是在向表中插入数据的时候,有约定条件not null的列值不能为空,否则会报错。

mysql> create table t1(id int not null, name varchar(4));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 (id, name) values (1, 'python');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into t1 (id, name) values (1, null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 (id, name) values (null, null);
ERROR 1048 (23000): Column 'id' cannot be null

primary key主键

该约束条件非常重要,但从约束条件的角度来看primary key的效果等价于not null + unique,即非空且唯一,主键除了有上述约束效果之外,还是innodb引擎组织存储数据的依据,innodb存储引擎在创建表的时候必须要有primary key,它类似与于的目录,能够帮助提示查询效率并且也是建表的依据。

一张表必须设置主键,并且一张表中有且只有一个主键,如果你没有设置主键,那么会从上往下搜索直到遇到一个非空且唯一的字段将它自动升级为主键。

mysql> create table t2(id int not null unique, name varchar(4));
Query OK, 0 rows affected (0.01 sec)

mysql> desc t2;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI | NULL    |       |
| name  | varchar(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

如果表内没有主键也没有其他任何的非空且唯一的字段,那么innodb会采用自己内部提供的一个隐藏字段作为主键,隐藏意味无法使用,就无法提升查询速度。

一张表中通常都应该有一个主键字段,并且通常将id/uid/sid字段作为主键。

-- 单一主键
mysql> create table t3(id int primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> desc t3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)

-- 联合主键
mysql> create table t4(ip varchar(16), port varchar(6), primary key(ip, port));
Query OK, 0 rows affected (0.07 sec)

mysql> desc t4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| ip    | varchar(16) | NO   | PRI |         |       |
| port  | varchar(6)  | NO   | PRI |         |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

auto_increment自增

通常设置主键是将与表中的数据没有关联的数据作为主键,一般选择数字,就像排队时的号码牌,因此主键最好选择整数类型并且能够自增,而auto_increment约束条件就是加在主键字段上的,并且在插入数据的时候主键的值无需手动插入了。

-- 创建表的完整语法
mysql> create table t5(id int primary key auto_increment, name varchar(4), age int(3), phone varchar(11));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t5 (name, age, phone) values ('python', 5, '119'),('java', 10, '120');
Query OK, 2 rows affected, 1 warning (0.15 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> select * from t5;
+----+------+------+-------+
| id | name | age  | phone |
+----+------+------+-------+
|  1 | pyth |    5 | 119   |
|  2 | java |   10 | 120   |
+----+------+------+-------+
2 rows in set (0.00 sec)

mysql> desc t5;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(4)  | YES  |     | NULL    |                |
| age   | int(3)      | YES  |     | NULL    |                |
| phone | varchar(11) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

修改表结构

-- 修改表名:alter table 表名 rename 新表名;
mysql> create table t1(id int unique);
Query OK, 0 rows affected (0.01 sec)

mysql> alter table t1 rename t;
Query OK, 0 rows affected (0.01 sec)

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


-- 表增加字段: alter table 表名 add 字段名 数据类型(宽度) 约束条件;
mysql> alter table t add name varchar(4) not null;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  | UNI | NULL    |       |
| name  | varchar(4) | NO   |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (1.05 sec)

-- 表删除字段,字段删除后数据也会删除: alter table 表名 drop 字段名;
mysql> alter table t drop name;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)

-- 表修改字段名:alter table 表名 change 旧字段名 新字段名 数据类型(宽度) 约束条件;
mysql> alter table t change id uid int unique;
Query OK, 0 rows affected, 1 warning (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> desc t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| uid   | int(11) | NO   | PRI | 0       |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)

-- 修改字段数据类型、约束条件等:alter table 表名 modify 字段名 数据类型(宽度) 约束条件;
mysql> alter table t modify id int primary key auto_increment;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.01 sec)

-- 修改字段排列顺序
ALTER TABLE 表名 CHANGE 字段名  旧字段名 新字段名 新数据类型 [完整性约束条件…]  FIRST;
ALTER TABLE 表名 MODIFY 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;

-- 增加字段时指定字段位置
ALTER TABLE 表名 ADD 字段名  数据类型 [完整性约束条件…]  FIRST;
ALTER TABLE 表名 ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;

-- 操作主键,如果发现主键建错了,可以先删除主键再增加主键,需要注意在增加主键前必须把重复主键值删除
alter table t drop primary key;
alter table t add primary key(id);

删除表

删除操作一定要谨慎,时刻谨记删库跑路的教训哦~

-- 切换到数据库下
use study;

-- 删除表
drop table 表名;

-- 删除表中的数据
delete from 表名;  -- 删除表中的所有数据,但是主键的自增不会停止
truncate 表名;  -- 清空表数据并重置主键

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图&#xff1a;Discuz X3.5的系统信息&#xff0c;上传许可为1024MB(1GB) 论坛为局域网论坛&#xff0c;仅供内部同事交流使用&#xff01; 使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图&#xff1a;选择上传附件&#xff08;提示可以最大上传100M&#xff09;…

新模型Claude 3实测!各项能力超强,确实比GPT-4好用

2024最新教程Claude 3注册账号&#xff0c;小白教程包教包会 过去不到一个月&#xff0c;OpenAI 扔出 Sora 这个重磅炸弹后成为全球焦点&#xff0c;不断推出的视频更是赚足眼球、热度不减。昨晚&#xff0c;Anthropic 突然惊喜上线&#xff0c;时隔八个月携着 Claude 3 走来&…

【Java EE 】认识文件与Java文件操作

目录 &#x1f340;认识文件&#x1f338;树型结构组织 和 目录&#x1f338;文件路径&#xff08;Path&#xff09;&#x1f338;其他知识 &#x1f333;Java 中操作文件&#x1f338;File 概述&#x1f33b;属性&#x1f33b;构造方法&#x1f33b;方法 &#x1f338;代码示例…

西安雁塔未来人工智能计算中心算力成本分析

先看一例旧闻&#xff1a;西部“最强大脑”落户雁塔——30亿亿次超算能力助力创新之城建设 其中提到一期算力为 300PFLOPS FP16&#xff08;每秒30亿亿次半精度浮点计算&#xff09;&#xff0c;项目总投资约为19亿元。 这个算力是什么概念呢&#xff1f; 我们以深度学习训练中…

100%开源大模型OLMo:代码/权重/数据集/训练全过程公开,重定义AI共享

前言 近日&#xff0c;艾伦人工智能研究所联合多个顶尖学术机构发布了史上首个100%开源的大模型“OLMo”&#xff0c;这一举措被认为是AI开源社区的一大里程碑。OLMo不仅公开了模型权重&#xff0c;还包括了完整的训练代码、数据集和训练过程&#xff0c;为后续的开源工作设立…

C语言回顾学习

一、数据类型 1.常量 2.float浮点表示 3.字符型 4.char&#xff08;大小写&#xff09; #include <stdio.h> //根据数字输出字符--int值可以直接输出为char int main() {int value;while (1){scanf("%d",&value);if(value<65||value>122){printf(&…

【Redis】RedisTemplate和StringRedisTemplate的区别

两者的关系是 StringRedisTemplate 继承 RedisTemplate 。 两者的数据是不共通的&#xff1a;也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据&#xff0c;RedisTemplate 只能管理 RedisTemplate 中的数据。 RedisTemplate 看这个类的名字后缀是 Temp…

android开发游戏加速器,Android架构组件Room功能详解

Java基础 Java Object类方法HashMap原理&#xff0c;Hash冲突&#xff0c;并发集合&#xff0c;线程安全集合及实现原理HashMap 和 HashTable 区别HashCode 作用&#xff0c;如何重载hashCode方法ArrayList与LinkList区别与联系GC机制Java反射机制&#xff0c;Java代理模式Jav…

UOS 20 安装redis 7.0.11 安装redis 7.0.11时 make命令 报错 /bin/sh: cc: command not found

UOS 20 安装redis 7.0.11 1、下载redis 7.0.112、安装redis 7.0.113、启动停止redis 7.0.114、安装过程问题记录 UOS 20 安装redis 7.0.11 安装redis 7.0.11时 make命令 报错 /bin/sh: cc: command not found、zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such fil…

jquery选择器有哪些

jQuery是一个功能强大的JavaScript库&#xff0c;它提供了丰富的选择器来帮助开发者更方便地选择和操作DOM元素。以下是jQuery的一些常用选择器及其示例代码&#xff1a; 1.基本选择器&#xff1a; // 通过ID选择元素 $("#myId").css("color", "red…

java实现文件上传到本地

很多时候我们都需要进行文件上传和下载的操作&#xff0c;具体怎么实现网上的代码其实也是挺多的&#xff0c;刚好我的项目中也遇到了文件上传和下载的需求&#xff0c;本篇博文具体讲解上传操作&#xff0c;下篇博文讲解下载操作。 我们具体来想一想要将一个从前端传来的文件…

一命通关二分搜索

二分法 简介 和双指针一样&#xff0c;二分法也是一种优化方法&#xff0c;或者说二分法就是双指针的一类。不过&#xff0c;二分法的思想比双指针诞生更早也更广泛&#xff0c;在我们日常生活里也无时不刻在使用二分的思想。 比如我们想回顾某些影片&#xff0c;但是只记得…

书籍推荐:ChatGPT,大模型的预训练、迁移和中间件编程学习。

前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xff0c;被科技界誉为人…

【Redis | 第二篇】Redis的五种数据类型和相关命令

文章目录 2.Redis的数据类型和相关命令2.1常用数据类型2.2特性和用途2.2.1字符串&#xff08;String&#xff09;2.2.2哈希&#xff08;Hash&#xff09;2.2.3列表&#xff08;List&#xff09;2.2.4集合&#xff08;Set&#xff09;2.2.5有序集合&#xff08;Sorted Set&#…

网络编程 24/3/4 作业

1、广播 发送端 #include <myhead.h> int main(int argc, const char *argv[]) {//创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}//设置当前套接字允许广播属性int broadcast1;if(setsockopt(sfd,SOL_SOCKET…

【IO】进程间通信

A程序代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <string.h> int main(int argc, const char *argv[]) {if(mkfifo…

MySQL面试题纯享版

基础内容 1、MySQL的架构分层 2、一条 SQL 查询语句的执行流程 3、如何查看 MySQL 服务被多少个客户端连接了&#xff1f; 4、 空闲连接会一直占用着吗&#xff1f; 5、MySQL 的连接数有限制吗&#xff1f; 6、 怎么解决长连接占用内存的问题&#xff1f; 7、执行器与存储引擎…

Java 并发编程 面试题及答案整理,最新面试题

Java中的volatile关键字有什么作用&#xff1f; volatile关键字在Java中的作用包括&#xff1a; 1、保证可见性&#xff1a; 确保变量的修改对其他线程立即可见。 2、防止指令重排&#xff1a; 防止编译器对操作进行重排序&#xff0c;保证代码的执行顺序。 3、非原子性&am…

xss.haozi.me:0x0B

<svg><script>(1)</script>

数仓实战——京东数据指标体系的构建与实践

目录 一、如何理解指标体系 1.1 指标和指标体系的基本含义 1.2 指标和和标签的区别 1.3 指标体系在数据链路中的位置和作用 1.4 流量指标体系 1.5 指标体系如何向上支撑业务应用 1.6 指标体系背后的数据加工逻辑 二、如何搭建和应用指标体系 2.1 指标体系建设方法—OS…