MySQL修改表和字段

修改表名

语句:alter table 旧表名 rename to 新表名;to为可选参数,有无都不想影响结构。
例子:

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1          |
| tb_dept2          |
| tb_dept3          |
| tb_emp0           |
| tb_emp1           |
| tb_emp2           |
| tb_emp5           |
| tb_emp6           |
| tb_emp7           |
| tb_emp8           |
+-------------------+
10 rows in set (0.01 sec)

mysql> alter table tb_dept3 rename tb_deptment3;
Query OK, 0 rows affected (0.09 sec)

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1          |
| tb_dept2          |
| tb_deptment3      |
| tb_emp0           |
| tb_emp1           |
| tb_emp2           |
| tb_emp5           |
| tb_emp6           |
| tb_emp7           |
| tb_emp8           |
+-------------------+
10 rows in set (0.00 sec)

修改字段的数据类型

语句:alter table 表名 modify 字段名 数据类型

例子:

mysql> desc tb_dept1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(25) | YES  |     | NULL    |       |
| loc   | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> alter table tb_dept1 modify name varchar(30);
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_dept1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| loc   | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

修改字段名

语法:alter table 表名 change 旧字段名 新字段名 新数据类型;
这个即可以更改字段名,也可以更改数据类型。

例子:

mysql> desc tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(30) | YES  |     | NULL    |       |
| location | varchar(45) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> alter table tb_dept1 change location loc varchar(50);
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_dept1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| loc   | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

添加字段

语法:alter table 表名 add 新字段名 数据类型 约束条件 frist|after 已存在字段名。

添加无完整性约束条件的字段

例子:

mysql> alter table tb_dept1 add managerrId int(10);
Query OK, 0 rows affected (0.21 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

添加有完整性约束条件的字段

例子:

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> alter table tb_dept1 add column1 varchar(12) not null;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

在表的第一列添加一个字段

例子

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> alter table tb_dept1 add column2 varchar(12) not null first;
Query OK, 0 rows affected (0.29 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| column2    | varchar(12) | NO   |     | NULL    |       |
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

在表的指定列后添加一个字段

例子:

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| column2    | varchar(12) | NO   |     | NULL    |       |
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> alter table tb_dept1 add column3 varchar(12) not null after name;
Query OK, 0 rows affected (0.23 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| column2    | varchar(12) | NO   |     | NULL    |       |
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| column3    | varchar(12) | NO   |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

删除字段

语句:alter table 表名 drop 字段名。

例子:

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| column2    | varchar(12) | NO   |     | NULL    |       |
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| column3    | varchar(12) | NO   |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

mysql> alter table tb_dept1 drop column2;
Query OK, 0 rows affected (0.24 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| column3    | varchar(12) | NO   |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

修改字段的排列位置

语法:alter table 表名 moidfy 字段一 数据类型 first|after 字段二。
如果使用first,就是将字段一放在第一列,若使用after 字段二,就是将字段一放在字段二之后。

修改字段为表的第一个字段

例子:

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| column3    | varchar(12) | NO   |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
| column1    | varchar(12) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> alter table tb_dept1 modify column1 varchar(12) first;
Query OK, 0 rows affected (0.35 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| column1    | varchar(12) | YES  |     | NULL    |       |
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| column3    | varchar(12) | NO   |     | NULL    |       |
| loc        | varchar(50) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

修改字段到表的指定列之后

例子:


mysql> alter table tb_dept1 modify column1 varchar(12) after loc;
Query OK, 0 rows affected (0.33 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table tb_dept1 change loc location varchar(50);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe tb_dept1;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(30) | YES  |     | NULL    |       |
| column3    | varchar(12) | NO   |     | NULL    |       |
| location   | varchar(50) | YES  |     | NULL    |       |
| column1    | varchar(12) | YES  |     | NULL    |       |
| managerrId | int(10)     | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

更改表的存储引擎

使用show engines;查看系统支持的存储引擎。

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

更改存储引擎的语法:
alter table 表名 engine=更改的存储引擎名;

mysql> show  create table tb_deptment3\G
*************************** 1. row ***************************
       Table: tb_deptment3
Create Table: CREATE TABLE `tb_deptment3` (
  `id` int(11) NOT NULL,
  `name` varchar(22) DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `sth` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> alter table tb_deptment3 engine=myisam;
Query OK, 0 rows affected (0.23 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show  create table tb_deptment3\G
*************************** 1. row ***************************
       Table: tb_deptment3
Create Table: CREATE TABLE `tb_deptment3` (
  `id` int(11) NOT NULL,
  `name` varchar(22) DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `sth` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

删除表的外键约束

语法:alter table 表名 drop foreign key 外键约束名。

例子:

mysql> show create table tb_emp9\g
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp9 | CREATE TABLE `tb_emp9` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_emp_dept` (`deptId`),
  CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table tb_emp9 drop foreign key fk_emp_dept;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table tb_emp9\g
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp9 | CREATE TABLE `tb_emp9` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_emp_dept` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

删除数据表

删除表的同时,表的定义和表的所有数据都会被删除。

删除没有关联的表

语法:drop table if exists 表名1,表名2, … , 表名n。可以一次删除一个或多个没有与其他相关的数据表。
if exists 的作用是如果删除的表不存在,则不会报错,而是会出现一个警告,若是不加,如果删除不存在的表示会出错。

eg:

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1          |
| tb_dept2          |
| tb_deptment3      |
| tb_emp0           |
| tb_emp1           |
| tb_emp2           |
| tb_emp5           |
| tb_emp6           |
| tb_emp7           |
| tb_emp8           |
| tb_emp9           |
+-------------------+
11 rows in set (0.00 sec)

mysql> drop table if exists tb_dept2;
Query OK, 0 rows affected (0.10 sec)

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1          |
| tb_deptment3      |
| tb_emp0           |
| tb_emp1           |
| tb_emp2           |
| tb_emp5           |
| tb_emp6           |
| tb_emp7           |
| tb_emp8           |
| tb_emp9           |
+-------------------+
10 rows in set (0.00 sec)

删除被其他表的关联的主表

在数据表之间存在外键关联的情况下,如果直接删除父表,会报错,要先删除它关联的子表才能删除父表,若是只想删除父表,可以先删除外键约束,在删除父表。

例子:

mysql> create table tb_dept2
    -> (
    -> id       int(11)         primary key,
    -> name     varchar(22),
    -> location varchar(50)
    -> );
Query OK, 0 rows affected (0.21 sec)

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1          |
| tb_dept2          |
| tb_deptment3      |
| tb_emp0           |
| tb_emp1           |
| tb_emp2           |
| tb_emp5           |
| tb_emp6           |
| tb_emp7           |
| tb_emp8           |
| tb_emp9           |
+-------------------+
11 rows in set (0.00 sec)

mysql> create table tb_emp
    -> (
    -> id       int(11)         primary key,
    -> name     varchar(25),
    -> deptId   int(11),
    -> salary   float,
    -> constraint fk_emp_dept foreign key(deptId) references tb_dept2(id)
    -> );
Query OK, 0 rows affected (0.17 sec)

mysql> show create table tb_emp\g
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                                                                                                                                                                                |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp | CREATE TABLE `tb_emp` (
  `id` int(11) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_emp_dept` (`deptId`),
  CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept2` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> drop table tb_dept2;	//直接删除父表,报错
ERROR 3730 (HY000): Cannot drop table 'tb_dept2' referenced by a foreign key constraint 'fk_emp_dept' on table 'tb_emp'.
mysql> alter table tb_emp drop foreign key fk_emp_dept;	//删除外键约束
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table tb_emp\g
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                                                                                                |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp | CREATE TABLE `tb_emp` (
  `id` int(11) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_emp_dept` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> drop table tb_dept2;		//删除表,成功。
Query OK, 0 rows affected (0.11 sec)

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1          |
| tb_deptment3      |
| tb_emp            |
| tb_emp0           |
| tb_emp1           |
| tb_emp2           |
| tb_emp5           |
| tb_emp6           |
| tb_emp7           |
| tb_emp8           |
| tb_emp9           |
+-------------------+
11 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/A_easy_learner/article/details/115002315
今日推荐