修改表名
语句: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)