表的创建

有两种方式:1. 新创建一个表;2. 根据旧表结构创建新表;格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#################################################1.自定义创建新表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options] [select_statement]
########示例1
mysql> CREATE TABLE demo_0 (
-> `name` VARCHAR(32),
-> age TINYINT,
-> gender CHAR(1),
-> `resume` TEXT); #如果不指定字符集和校对规则,则采用默认对象
########示例2
mysql> CREATE TABLE demo_1 (
-> `name` VARCHAR(32),
-> age TINYINT,
-> gender CHAR(1),
-> `resume` TEXT)
-> CHARSET utf8 COLLATE utf8_bin ENGINE INNODB;
#################################################2.模仿旧表结构创建新表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(] LIKE old_tbl_name [)];
########示例1
mysql> CREATE TABLE IF NOT EXISTS demo_2 LIKE demo_1;
Query OK, 0 rows affected (0.02 sec)

详尽的 table_optionsselect_statementcreate_definition 内容请查看Mysql5.1手册 .

  • CREATE TABLE用于创建带给定名称的表。您必须拥有表 CREATE 权限。

  • 第 7、10 行的 name 和 resume 加上了反引号 ` ,这是因为 name 和 resume 是 Mysql 的保留字,为了避免冲突,需要加反引号

  • 创建表时默认在本数据库下创建,如果要在其他数据库中创建表,除了先切换到其他数据库再创建表,还可以使用以下方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> CREATE TABLE staffInfo.demo_0 (
-> `name` VARCHAR(32));
Query OK, 0 rows affected (0.01 sec)

mysql> USE staffInfo;
Database changed
mysql> SHOW TABLES;
+---------------------+
| Tables_in_staffinfo |
+---------------------+
| demo_0 |
+---------------------+
1 row in set (0.00 sec)

表名称被指定为 db_name.tbl_name ,以便在特定的数据库中创建表。不论是否有当前数据库,都可以通过这种方式创建表。如果您使用加引号的识别名,则应对数据库和表名称分别加引号。例如,`mydb` . `mytbl`是合法的,但是 `mydb.mytbl` 不合法。

  • 在创建表格时,您可以使用 TEMPORARY 关键词。只有在当前连接情况下,TEMPORARY 表才是可见的。当连接关闭时,TEMPORARY 表被自动取消。这意味着两个不同的连接可以使用相同的临时表名称,同时两个临时表不会互相冲突,也不与原有的同名的非临时表冲突。(原有的表被隐藏,直到临时表被取消时为止 )您必须拥有 CREATE TEMPORARY TABLES 权限,才能创建临时表。如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    mysql> CREATE TEMPORARY TABLE `aha`(data INT); #在stuinfo数据库中创建临时表
    Query OK, 0 rows affected (0.01 sec)
    mysql> quit; #断开当前连接并重新登入
    Bye
    C:\Windows\system32>mysql -u root -p
    Enter password: **********
    Welcome to the MySQL monitor.
    mysql> use stuinfo;
    Database changed
    mysql> show tables;
    +-------------------+
    | Tables_in_stuinfo |
    +-------------------+
    | test_0 |
    | test_1 |
    | test_2 |
    | test_3 |
    | test_5 | #之前的临时表消失
    +-------------------+
  • 要求某列不能为空,且指定默认值:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mysql> CREATE TABLE demo (
    -> country VARCHAR(32) NOT NULL DEFAULT "China");
    Query OK, 0 rows affected (0.02 sec)

    mysql> INSERT INTO demo VALUES(); #未插入具体值
    Query OK, 1 row affected (0.01 sec)

    mysql> SELECT * FROM demo;
    +---------+
    | country |
    +---------+
    | China | #默认值为china
    +---------+

    使用 NOT NULL DEFAULT 为某列指定默认值。

表的查看

查看当前数据库下的表

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SHOW TABLES;
+-------------------+
| Tables_in_stuinfo |
+-------------------+
| demo_1 |
| demo_3 |
| test_0 |
| test_1 |
| test_2 |
| test_3 |
| test_5 |
+-------------------+

查看表的结构

  1. 使用 DESCDESCRIBE
1
2
3
4
5
6
7
8
9
10
mysql> DESC demo_1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| age | tinyint(4) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| resume | text | YES | | NULL | |
| address | varchar(32) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
  1. 使用 SHOW CREATE TABLE
1
2
3
4
5
6
7
8
9
10
11
mysql> SHOW CREATE TABLE demo_1;
+--------+-------------------------------------------------------------------------------------------
| Table | Create Table ----------------------------------------------------------+
| demo_1 | CREATE TABLE `demo_1` (
`age` tinyint(4) DEFAULT NULL,
`gender` char(1) COLLATE utf8_bin DEFAULT NULL,
`resume` text COLLATE utf8_bin,
`address` varchar(32) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+--------+-------------------------------------------------------------------------------------------
1 row in set (0.00 sec)

和 DESCRIBE 相比,SHOW CREATE TABLE 展示的内容更加丰富,它可以查看表的存储引擎和字符编码;在 SHOW CREATE TABLE 语句的结尾处(分号前面)添加 \g 或者 \G 参数可以改变展示形式。

"查看表的状态
使用 SHOW TABLE STATUS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mysql> SHOW TABLE STATUS \G;
*************************** 1. row ***************************
Name: customer_info
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 5
Avg_row_length: 3276
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2022-09-09 17:03:51
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
*************************** 2. row ***************************
Name: fuck
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW

表的修改

其语法格式如下:

1
ALTER TABLE <表名> [修改选项]

修改选项的语法格式如下:

1
2
3
4
5
6
7
8
9
10
{ 
ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME [TO] <新表名>
| CHARACTER SET <字符集名> #或 CHARSET
| COLLATE <校对规则名>
}

更详细的选项参见Mysql5.1手册

修改表名

1
2
mysql> ALTER TABLE demo_2 RENAME TO demo_3;
Query OK, 0 rows affected (0.01 sec)

TO 可加可不加。

修改字符集

  1. 修改表的默认字符集
1
2
3
4
################修改表的字符集
mysql> ALTER TABLE demo_1 CHARSET utf8 COLLATE utf8_bin;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
  1. 修改列的字符集
1
2
3
4
5
6
7
8
9
10
11
12
13
################修改列的字符集
mysql> ALTER TABLE demo_5 CHANGE country country CHAR(10) CHARSET ascii;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> SHOW CREATE TABLE demo_5 \G;
*************************** 1. row ***************************
Table: demo_5
Create Table: CREATE TABLE `demo_5` (
`name` varchar(32) DEFAULT NULL,
`country` char(10) CHARACTER SET ascii DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

修改列的字符集时,可以不改名和列类型,但必须写出更改后(未更改)的名字和类型,这是捆绑在一起的操作。

添加列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> DESC demo_1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(32) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| resume | text | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> ALTER TABLE demo_1 ADD COLUMN address VARCHAR(32)
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC demo_1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(32) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| resume | text | YES | | NULL | |
| address | varchar(32) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+

默认是添加到最后一行,可使用关键字 AFTERFIRST 在指定位置插入新行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> DESC demo_5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(32) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> ALTER TABLE demo_5 ADD COLUMN addr VARCHAR(48) AFTER age;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC demo_5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(32) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| addr | varchar(48) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

修改列名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> ALTER TABLE demo_1 CHANGE COLUMN `name` `tel` VARCHAR(11);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC demo_1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| tel | varchar(11) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| resume | text | YES | | NULL | |
| address | varchar(32) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+

如果不需要修改字段的数据类型,可以将新数据类型设置成与原来一样,但数据类型不能为空

修改列类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> ALTER TABLE demo_1 MODIFY COLUMN tel VARCHAR(32);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC demo_1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| tel | varchar(32) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| resume | text | YES | | NULL | |
| address | varchar(32) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+

使用 MODIFY 来改变列的类型,此时不需要重命名。 使用 CHANGE 修改列类型时,必须重命名(名字可相同):

1
mysql> ALTER TABLE demo_1 CHANGE COLUMN `name` `name` VARCHAR(32);

删除列

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> ALTER TABLE demo_1 DROP tel;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> DESC demo_1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| age | tinyint(4) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| resume | text | YES | | NULL | |
| address | varchar(32) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+

表的删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SHOW TABLES;
+-------------------+
| Tables_in_stuinfo |
+-------------------+
| demo_0 |
| demo_1 |
+-------------------+

mysql> DROP TABLE demo_0;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW TABLES;
+-------------------+
| Tables_in_stuinfo |
+-------------------+
| demo_1 |
+-------------------+

其他事项

  • 如果您使用 ALTER TABLE 更改列规约,但是 DESCRIBE tbl_name 提示您列规约并没有改变,则可能是因为 MySQL 忽略了您所做的更改。例如,如果您试图把VARCHAR列更改为CHAR列,此时,如果表包含其它长度可变的列,则 MySQL 可能仍会使用VARCHAR。

  • ALTER TABLE 运行时会对原表进行临时复制( 除了 RENAME ),在副本上进行更改,然后删除原表,再对新表进行重命名 。在执行 ALTER TABLE 时,其它用户可以阅读原表,但是对表的更新和修改的操作将被延迟,直到新表生成为止。新表生成后,这些更新和修改信息会自动转移到新表上。

  • 要使用 ALTER TABLE,您需要获得表的 ALTER, INSERT 和 CREATE 权限。

  • 您可以在一个 ALTER TABLE 语句里写入多个 ADD, ALTER, DROP 和 CHANGE 子句,中间用逗号分开。这是 MySQL 相对于标准 SQL 的扩展。在标准 SQL 中,每个 ALTER TABLE 语句中每个子句只允许使用一次。例如,在一个语句中取消多个列:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    mysql> DESC demo_1;
    +---------+------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +---------+------------+------+-----+---------+-------+
    | gender | char(1) | YES | | NULL | |
    | resume | text | YES | | NULL | |
    | address | char(8) | YES | | NULL | |
    +---------+------------+------+-----+---------+-------+

    mysql> ALTER TABLE demo_1 DROP gender, DROP resume;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> DESC demo_1;
    +---------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +---------+---------+------+-----+---------+-------+
    | address | char(8) | YES | | NULL | |
    +---------+---------+------+-----+---------+-------+
    1 row in set (0.00 sec)
  • COLUMN 为可选关键字。CHARSETCHARACTER SET 相同。

  • 表中各列数据的字符集可以不同 。如果您在向表中添加一个新列时没有指定字符集,则此时使用表的默认字符集。注意,以下语句只改变了表的默认字符集:

    1
    mysql> ALTER TABLE demo_1 CHARSET utf8;

    如果您想要把表默认的字符集和所有字符列(CHAR, VARCHAR, TEXT)改为新的字符集,应使用如下语句:

    1
    ALTER TABLE tbl_name CONVERT TO CHARSET utf8;