数据表的基本操作2
(这里的例子有用到前面1的)
2.查看数据表结构
2.1查看表基本结构语句DESCRIBE
DESCRIBE/DESC可以查看字段的信息,其中包括:字段名、字段数据类型、是否为主键、是否有默认值等。语法规则:DESCRIBE 表名;
或者简写为:DESC 表名;
例:分别使用DESCRIBE和DESC查看表tb_dept3和特别tb_emp8的表结构。
查看tb_dept3表结构:
mysql> DESCRIBE tb_dept3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | YES | UNI | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.30 sec)
查看tb_emp8表结构:
mysql> DESC tb_emp8;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(22) | NO | | NULL | |
| deptId | int(11) | YES | MUL | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
其中,各个字段的含义如下:
- NULL:表示该列是否可以存储NULL值。
- Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示某个给定值允许出现多次。
- Default:表示该列是否有默认值,如果有的话默认值是多少。
- Extra:表示可以获取的与给定列的附加信息,例如AUTO_INCREMENT。
2.2查看表详细结构语句SHOW CREATE TABLE
其语法格式如下:SHOW CREATE TABLE<表名\G>;
此语句不仅可以查看创建时候的详细语句,而且还可以查看存储引擎和字符编码。
如果不用\G参数,显示的结果可能非常混乱,用了之后对心急的人好O(∩_∩)O哈哈。
例:使用SHOW CREATE TABLE 查看表tb_emp8的详细信息,语句如下:
mysql> SHOW CREATE TABLE tb_emp8;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_emp8 | CREATE TABLE `tb_emp8` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(22) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept5` (`deptId`),
CONSTRAINT `fk_emp_dept5` FOREIGN KEY (`deptId`) REFERENCES `tb_dept3` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
使用\G参数后,结果如下:;
mysql> SHOW CREATE TABLE tb_emp8\G;
*************************** 1. row ***************************
Table: tb_emp8
Create Table: CREATE TABLE `tb_emp8` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(22) NOT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept5` (`deptId`),
CONSTRAINT `fk_emp_dept5` FOREIGN KEY (`deptId`) REFERENCES `tb_dept3` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
3.修改数据表
修改表:修改数据库中已经存在的数据表的结构。
常用修改表的操作有:修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。
3.1修改表名
MySQL通过ALTER TABLE语句来实现表名的修改,具体语法规则如下:ALTER TABLE <旧表名> RENAME [TO] <新表名>;
执行修改表名操作之前要先查看数据库中所有的表:
mysql> SHOW TABLES;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1 |
| tb_dept2 |
| tb_dept3 |
| tb_emp5 |
| tb_emp6 |
| tb_emp7 |
| tb_emp8 |
+-------------------+
7 rows in set (0.05 sec)
下面使用ALTER TABLE将表tb_dept3改为tb_deptment3,SQL语句如下:
mysql> ALTER TABLE tb_dept3 RENAME tb_deptment3;
Query OK, 0 rows affected (0.37 sec)
执行之后检查是否改名成功:
mysql> SHOW TABLES;
+-------------------+
| Tables_in_test_db |
+-------------------+
| tb_dept1 |
| tb_dept2 |
| tb_deptment3 |
| tb_emp5 |
| tb_emp6 |
| tb_emp7 |
| tb_emp8 |
+-------------------+
7 rows in set (0.00 sec)
但是修改表名并不会影响表的结构,可用DESC查看:
mysql> DESC tb_deptment3;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | YES | UNI | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.03 sec)
3.2修改字段的数据类型
语法规则:ALTER TABLE <表名> MODIFY <字段名> <数据类型>
其中,表名是要修改数据类型的字段所在表的名称;字段名是需要修改的字段;数据类型是修改后字段的新数据类型。
例:将tb_dept1 中的name字段的数据类型由VARCHAR(22)改为VARCHAR(25)。
在修改之前先使用DESC查看tb_dept1表结构,结果如下:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.16 sec)
可以看到name字段数据类型为VARCHAR(22),下面修改再查看,SQL语句如下:
mysql> ALTER TABLE tb_dept1 MODIFY name VARCHAR(25);
Query OK, 0 rows affected (0.80 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(25) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
可见,修改已经成功。
3.3修改字段名
MySQL中修改表字段名的语法规则:ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>
注意:新数据类型不能为空,要想不改变则设置为与原来一样即可!
例:将数据表tb_dept1中的location字段名改为loc,数据类型保持不变,SQL语句如下:
mysql> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);
Query OK, 0 rows affected (0.22 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(25) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
当然,CHANGE也可以和MODIFY一样只修改数据类型,只需把新字段名设置为旧字段名即可 。读者可以试试,在这里我不多加示范啦。
提示:修改数据类型的时候要相当谨慎,因为若表中已经有数据时可能会受到影响。
3.4添加字段
添加字段的语法格式如下:ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST | AFTER 已存在字段名]
其中,FIRST为可选参数,其作用是将新添加的字段设置为表的第一个字段;AFTER为可选参数,作用是将新添加的字段添加到指定的“已存在字段”的后面。如果没有使用这两个参数,则默认添加到数据表的最后列。
- 添加无完整性约束条件的字段
例:在数据表tb_dept1中添加一个无完整性约束条件的INT类型的字段manageId(部门经理编号),SQL语句如下:ALTER TABLE tb_dept1 ADD manageId INT(10);
使用DESC查看,可以看到:
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 | |
| manageId | int(10) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.03 sec)
- 添加有完整性约束条件的字段
例:在数据表tb_dept1中添加一个不能为空的VARCHAR(12)类型的字段column1,SQL语句如下:
mysql> ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) NOT NULL;
Query OK, 0 rows affected (0.65 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC查看有:
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 | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
- 在表的第一列添加一个字段
例:在表tb_dept1中添加一个INT类型的字段column2,SQL语句如下:
mysql> ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST;
Query OK, 0 rows affected (0.78 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC查看有:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 在表的指定列之后添加一个字段
例:在数据表tb_dept1中name列后添加一个INT类型的字段column3,SQL语句如下:
mysql> ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name;
Query OK, 0 rows affected (0.90 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC有:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
可以看到tb_dept1中新增的字段column3在name字段后面。
3.5删除字段
删除字段的语法格式:ALTER TABLE <表名> DROP <字段名>;
例:删除tb_dept1表中的字段column2字段:
mysql> ALTER TABLE tb_dept1 DROP column2;
Query OK, 0 rows affected (0.55 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(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
可以看到column2字段已经被删除成功。
3.6修改字段的排列位置
通过ALTER TABLE改变表中字段的相对位置,语法格式如下:ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST | AFTER <字段2>;
字段一为要修改位置的字段。
- 修改字段为表的第一个字段
例:将数据表tb_dept1中的column1修改为表的第一个字段,SQL语句如下:
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST;
Query OK, 0 rows affected (0.66 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用DESC 查看表tb_dept1,发现移动成功:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| column1 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 修改字段到表的指定列之后
例:将数据表tb_dept1中的column1字段插入到loc字段后面,SQL语句如下:
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER loc;
Query OK, 0 rows affected (0.51 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(25) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | YES | | NULL | |
| manageId | int(10) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
3.7更改表的存储引擎
MySQL中主要存储引擎:MyISAM、InnoDB、MERORY(HEAP)、BDB、FEDERATED等。
可以用SHOW ENGINES;
语句查看系统支持的存储引擎。
更改表的存储引擎的语法格式如下:ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
例:将数据表tb_deptment3的存储引擎修改为MyIASM。
修改前先查看表tb_deptment3当前的存储引擎:
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=latin1
1 row in set (0.00 sec)
(注意:这里如果出现ERROR: No query specified
的错误,表示你的分号重复了,如果使用了\G则其代表了一个分号,所以\G后面可不带分号。)
可以看到表tb_deptment3当前的存储引擎为 ENGINE=InnoDB,下面修改存储引擎类型,SQL语句如下:
这里我一开始尝试的时候出现了错误:
mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
这为什么会出错呢?因为有外键约束束缚了tb_deptment3,而MyISAM存储引擎不支持外键,所以不能更改存储引擎。要想将存储引擎InnoDB更改为MyISAM存储引擎只能将外键关系先删除了。
mysql> ALTER TABLE tb_emp5 DROP FOREIGN KEY fk_emp_dept1;
Query OK, 0 rows affected (0.37 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_emp8 DROP FOREIGN KEY fk_emp_dept5;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_emp6 DROP FOREIGN KEY fk_emp_dept2;
Query OK, 0 rows affected (0.19 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tb_emp7 DROP FOREIGN KEY fk_emp_dept3;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
上述是我前面加了外键约束的表,所以删起来还得回去看记录,如果忘记了外键约束名称可以使用SHOW CREATE TABLE <表名> \G
查看。
当将所有外键关系删除之后:
mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM;
Query OK, 0 rows affected (0.65 sec)
Records: 0 Duplicates: 0 Warnings: 0
再次查看表tb_deptment3的存储引擎,可以看到存储引擎更改成功了:
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=latin1
1 row in set (0.10 sec)
3.8删除表的外键约束
在3.7的时候由于外键约束的存在让我们更改引擎变得麻烦,我们删除了外键约束,在这一过程中大概也明白了如何删除外键约束。
其语法格式为:ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>
例子前面已经展示,这里不多做说明。