MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
-
RDBMS术语
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
-
管理MySQL的命令
-
USE 数据库名 :
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。mysql> use mysql; Database changed
-
SHOW DATABASES:
列出 MySQL 数据库管理系统的数据库列表。mysql> show databases; +--------------------+ | Database | +--------------------+ | django数据库 | | information_schema | | jdbc_test | | mysql | | performance_schema | | sakila | | sys | | world | | 爬虫数据库 | +--------------------+ 12 rows in set (0.01 sec)
-
SHOW TABLES:
显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。mysql> use 爬虫数据库; Database changed mysql> show tables; +----------------------+ | Tables_in_爬虫数据库 | +----------------------+ | douban | | url_list | +----------------------+ 2 rows in set (0.00 sec)
-
SHOW COLUMNS FROM 数据表:
显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。mysql> SHOW COLUMNS FROM douban; +---------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------+------+-----+---------+-------+ | serial_number | varchar(32) | NO | PRI | NULL | | | movie_name | varchar(255) | YES | | NULL | | | introduce | varchar(1000) | YES | | NULL | | | star | varchar(10) | YES | | NULL | | | evaluate | varchar(255) | YES | | NULL | | | describe | varchar(255) | YES | | NULL | | +---------------+---------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
-
SHOW INDEX FROM 数据表:
显示数据表的详细索引信息,包括PRIMARY KEY(主键)。mysql> SHOW INDEX FROM douban; +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | douban | 0 | PRIMARY | 1 | serial_number | A | 250 | NULL | NULL | | BTREE | | | YES | NULL | +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ 1 row in set (0.01 sec)
-
SHOW TABLE STATUS LIKE [FROM db_name] [LIKE ‘pattern’] \G:
该命令将输出Mysql数据库管理系统的性能及统计信息。mysql> SHOW TABLE STATUS FROM 爬虫数据库; # 显示数据库 爬虫数据库 中所有表的信息 +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | douban | InnoDB | 10 | Dynamic | 250 | 393 | 98304 | 0 | 0 | 0 | NULL | 2019-04-28 01:30:48 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | | url_list | InnoDB | 10 | Dynamic | 13 | 1260 | 16384 | 0 | 0 | 0 | 17 | 2019-04-14 16:08:28 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
mysql> SHOW TABLE STATUS FROM 爬虫数据库 LIKE 'url%'; # 表名以url开头的表的信息 +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | url_list | InnoDB | 10 | Dynamic | 13 | 1260 | 16384 | 0 | 0 | 0 | 17 | 2019-04-14 16:08:28 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ 1 row in set (0.00 sec)
mysql> SHOW TABLE STATUS FROM 爬虫数据库 LIKE 'url%' \G ; # 加上 \G,查询结果按列打印 *************************** 1. row *************************** Name: url_list Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 13 Avg_row_length: 1260 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: 17 Create_time: 2019-04-14 16:08:28 Update_time: NULL Check_time: NULL Collation: utf8mb4_0900_ai_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
-
-
MySQL 创建数据库
-
我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下:
CREATE DATABASE 数据库名; # 例子: mysql> CREATE DATABASE test; Query OK, 1 row affected (0.01 sec)
-
使用 mysqladmin 创建数据库
使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库。
所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库。
以下命令简单的演示了创建数据库的过程,数据名为 test2:C:\Users\Administrator> mysqladmin -u root -p create test2 Enter password: **** # 进入数据库 查看是否创建了 test2数据库 C:\Users\Administrator>mysql -uroot -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 Server version: 8.0.15 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | database | | information_schema | | jdbc_test | | mysql | | performance_schema | | sakila | | sys | | test | | test2 | | world | +--------------------+ 10 rows in set (0.00 sec)
-
-
MySQL 删除数据库
-
使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。在删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失。
-
drop 命令删除数据库
drop 命令格式:drop database <数据库名>; # 例如删除名为 test1 的数据库: mysql> drop database test; Query OK, 0 rows affected (0.01 sec)
-
使用 mysqladmin 删除数据库
C:\Users\Administrator>mysqladmin -u root -p drop test Enter password: **** Dropping the database is potentially a very bad thing to do. Any data stored in the database will be destroyed. Do you really want to drop the 'test' database [y/N] y Database "test" dropped
-
-
MySQL 数据类型
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
-
数值类型:
MySQL支持所有标准SQL数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。 关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。 BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。 作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
-
日期和时间类型:
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。 TIMESTAMP类型有专有的自动更新特性,将在后面描述。
-
字符串类型:
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。 BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。 也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。 BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。 有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
-
关于汉字占多少个字节问题:
MySQL 5.0 以上的版本: 1、一个汉字占多少长度与编码有关: UTF-8:一个汉字=3个字节 GBK:一个汉字=2个字节 2、varchar(n) 表示 n 个字符,无论汉字和英文,Mysql 都能存入 n 个字符,仅是实际字节长度有所区别 3、MySQL 检查长度,可用 SQL 语言来查看: select LENGTH(fieldname) from tablename
-
-
MySQL 创建数据表
创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段
-
语法,以下为创建MySQL数据表的SQL通用语法:
CREATE TABLE table_name (column_name column_type);
以下例子中我们将在 test 数据库中创建数据表test_tbl:
CREATE TABLE IF NOT EXISTS `test_tbl`( `id` INT UNSIGNED AUTO_INCREMENT, `title` VARCHAR(100) NOT NULL, `author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
实例解析:
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
-
通过命令提示符创建表:
通过 mysql> 命令窗口可以很简单的创建MySQL数据表。你可以使用 SQL 语句 CREATE TABLE 来创建数据表。
-
实例
以下为创建数据表 test_tbl 实例:mysql> use test; Database changed mysql> use test; Database changed mysql> CREATE TABLE `test_tb1`( -> `id` INT UNSIGNED AUTO_INCREMENT, -> `title` VARCHAR(100) NOT NULL, -> `author` VARCHAR(40) NOT NULL, -> `submission_date` DATE, -> PRIMARY KEY(`id`)) ENGINE InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected, 1 warning (0.05 sec)
注意:MySQL命令终止符为分号 ; 。
注意: -> 是换行符标识,不要复制。
-
PS:
创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上角 esc 按键下面的那一个 ~ 按键,坑惨了。
反引号是为了区分 MySql 关键字与普通字符而引入的符号,一般的,表名与字段名都使用反引号。
-
-
MySQL 删除数据表
MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心, 因为执行删除命令后所有数据都会消失。
-
语法,以下为删除MySQL数据表的通用语法:
DROP TABLE table_name ;
-
在命令提示窗口中删除数据表:
# 删除 test 数据库中的 test_tb1表 mysql> use test; Database changed mysql> DROP TABLE test_tb1; Query OK, 0 rows affected (0.03 sec)
-
执行成功后,我们使用以下命令,就看不到 test_tb1 表了:
mysql> show tables; Empty set (0.01 sec)
-
MySQL 表中使用 INSERT INTO SQL语句来插入数据。
你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过Python脚本来插入数据(关于python脚本后期会写一篇博客)。
以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
如果数据是字符型,必须使用单引号或者双引号,如:“value”。
-
通过命令提示窗口插入数据
以下我们将使用 SQL INSERT INTO 语句向 MySQL 数据表 test_tb1 插入数据:
mysql> use test_tbl; Database changed mysql> INSERT INTO test_tbl -> (title,author,submission_date) -> VALUES ()); -> ("学习Python","松本刚",NOW()); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> INSERT INTO test_tbl -> (title,author,submission_date) -> VALUES -> ("学习Mysql","松本刚",NOW()); Query OK, 1 row affected, 1 warning (0.03 sec)
注意: 使用箭头标记 -> 不是 SQL 语句的一部分,它仅仅表示一个新行,如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写 SQL 语句,SQL 语句的命令结束符为分号 ;。
在以上实例中,我们并没有提供 id 的数据,因为该字段我们在创建表的时候已经设置它为 AUTO_INCREMENT(自动增加) 属性。 所以,该字段会自动递增而不需要我们去设置。实例中 NOW() 是一个 MySQL 函数,该函数返回日期和时间。
接下来我们可以通过以下语句查看数据表数据:
mysql> SELECT * FROM test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 学习Python | 松本刚 | 2019-09-16 | | 2 | 学习Mysql | 松本刚 | 2019-09-16 | +----+------------+--------+-----------------+ 2 rows in set (0.00 sec)
-
INSERT 插入多条数据
INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN), (valueB1,valueB2,...valueBN), (valueC1,valueC2,...valueCN)......;
-
添加数据的时候可以规定列进行添加。
如果所有的列都要添加数据可以不规定列进行添加数据:
mysql> INSERT INTO runoob_tbl -> VALUES -> (0, "JAVA 教程", "JAVA.COM", '2019-09-06');
第一列如果没有设置主键自增(PRINARY KEY AUTO_INCREMENT)的话添加第一列数据比较容易错乱,要不断的查询表看数据。
如果添加过主键自增(PRINARY KEY AUTO_INCREMENT)第一列在增加数据的时候,可以写为0或者null,这样添加数据可以自增, 从而可以添加全部数据,而不用特意规定那几列添加数据。
-
MySQL 查询数据
MySQL 数据库使用SQL SELECT语句来查询数据。 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过Python脚本来查询数据。
语法,以下为在MySQL数据库中查询数据通用的 SELECT 语法:
SELECT column_name,column_name FROM table_name [WHERE Clause] [LIMIT N][ OFFSET M]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
SELECT 命令可以读取一条或者多条记录。
你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
你可以使用 WHERE 语句来包含任何条件。
你可以使用 LIMIT 属性来设定返回的记录数。
你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。-
通过命令提示符获取数据:
以下实例我们将通过 SQL SELECT 命令来获取 MySQL 数据表 test_tbl 的数据:
mysql> SELECT * FROM test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 学习Python | 松本刚 | 2019-09-16 | | 2 | 学习Mysql | 松本刚 | 2019-09-16 | | 3 | 学习php | 大隐 | 2019-09-18 | +----+------------+--------+-----------------+ 3 rows in set (0.00 sec)
-
-
MySQL WHERE 子句
我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:
SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
你可以在 WHERE 子句中指定任何条件。
你可以使用 AND 或者 OR 指定一个或多个条件。
WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
-
从命令提示符中读取数据:
我们将在SQL SELECT语句使用WHERE子句来读取MySQL数据表 runoob_tbl 中的数据:
实例
以下实例将读取 test_tbl 表中 author 字段值为 松本刚 的所有记录:
SELECT * from test_tbl WHERE author='松本刚'; mysql> SELECT * from test_tbl WHERE author='松本刚'; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 学习Python | 松本刚 | 2019-09-16 | | 2 | 学习Mysql | 松本刚 | 2019-09-16 | +----+------------+--------+-----------------+ 2 rows in set (0.00 sec)
- MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。
-
MySQL UPDATE 更新
如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作。
以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
你可以同时更新一个或多个字段。
你可以在 WHERE 子句中指定任何条件。
你可以在一个单独表中同时更新数据。
当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。
-
通过命令提示符更新数据
-
以下我们将在 SQL UPDATE 命令使用 WHERE 子句来更新 test_tbl 表中指定的数据:
以下实例将更新数据表中 id 为 3 的 title 字段值:
mysql> UPDATE test_tbl SET title='学习前端' WHERE id=3; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 学习python | 松本刚 | 2019-09-16 | | 2 | 学习Java | 松本刚 | 2019-09-16 | | 3 | 学习前端 | 大隐 | 2019-09-18 | +----+------------+--------+-----------------+ 3 rows in set (0.00 sec)
-
-
MYSQL DELETE 删除语句
语法:
DELETE FROM table_name [WHERE Clause]
1. 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。 2. 你可以在 WHERE 子句中指定任何条件 3. 您可以在单个表中一次性删除记录。 ps:当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。
实例:
以下将删除 test_tbl表中 id=3 的记录: mysql> DELETE FROM test_tbl WHERE id=3; Query OK, 1 row affected (0.23 sec) mysql> select * from test_tbl; +----+------------+--------+-----------------+ | id | title | author | submission_date | +----+------------+--------+-----------------+ | 1 | 学习python | 松本刚 | 2019-09-16 | | 2 | 学习Java | 松本刚 | 2019-09-16 | +----+------------+--------+-----------------+ 2 rows in set (0.00 sec)
笔记:
delete,drop,truncate 都有删除表的作用,区别在于: 1、delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了。 2、delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。 3、执行的速度上,drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。
-
ALTER 命令
当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。 首先创建一张表,表名为:testalter_tbl mysql> CREATE TABLE testalter_tbl( -> i INT, -> c CHAR(1) -> ); Query OK, 0 rows affected (0.04 sec) mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | i | int(11) | YES | | NULL | | | c | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
-
删除,添加或修改表字段:
如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段: mysql> ALTER TABLE testalter_tbl DROP i; Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0
如果数据表中只剩余一个字段则无法使用DROP来删除字段。
MySQL 中使用 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型: mysql> ALTER TABLE testalter_tbl ADD i INT; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
执行以上命令后,i 字段会自动添加到数据表字段的末尾。
mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:
ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT FIRST; ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT AFTER c;
-
修改字段类型及名称:
如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10); Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0
使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT; Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | j | bigint(20) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
-
ALTER TABLE 对 Null 值和默认值的影响:
mysql> ALTER TABLE testalter_tbl CHANGE j i INT NOT NULL DEFAULT 1000; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | i | int(11) | NO | | 1000 | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) 如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。
-
修改字段默认值:
你可以使用 ALTER 来修改字段的默认值,尝试以下实例:
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 100; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | i | int(11) | NO | | 100 | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.01 sec)
你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值,如下实例:
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM testalter_tbl; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | i | int(11) | NO | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
-
修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM :
注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。
mysql> ALTER TABLE testalter_tbl ENGINE= MYISAM; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW TABLE STATUS LIKE 'testalter_tbl' \G; *************************** 1. row *************************** Name: testalter_tbl Engine: MyISAM Version: 10 Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2019-10-10 19:59:37 Update_time: NULL Check_time: NULL Collation: utf8mb4_0900_ai_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
-
修改表名:
如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。
尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl; Query OK, 0 rows affected (0.01 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | alter_tbl | | test_tbl | +----------------+ 2 rows in set (0.00 sec)
-
end…