表的操作
1. 创建表
语法:
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
说明:
field 表示列名
datatype 表示列的类型
character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准
collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准
2. 创建表案例
这里为啥存储引擎发生变化会导致这种情况出现,我们在后面讲。
3. 查看表结构
示例:
desc 表名;
查看创建时的语句:
show create table users1;
或者
show create table users1 \G
我们仔细观察发现上述语句和我们自己进行输入时有些不同
我们自己输入的SQL命令会传给服务器上的mysqld服务,帮我们进行规范(标准化),再对数据库进行读取
MySQL会将用户操作的所有指令记录下来。这也就是备份数据库时我们看到的都是语句的原因
4. 修改表
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename DROP (column);
案例:
首先在users表添加二条数据
mysql> show create table users \G
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` char(32) DEFAULT NULL COMMENT '用户的密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> insert into users values(1,'张三','12345','2002-08-07');
Query OK, 1 row affected (0.00 sec)
mysql> insert into users values(2,'李四','54321','2000-07-07');
Query OK, 1 row affected (0.00 sec)
mysql> select * from users;
+------+--------+----------+------------+
| id | name | password | birthday |
+------+--------+----------+------------+
| 1 | 张三 | 12345 | 2002-08-07 |
| 2 | 李四 | 54321 | 2000-07-07 |
+------+--------+----------+------------+
2 rows in set (0.00 sec)
场景1:在users表添加一个字段,用于保存图片路径(添加属性列)
mysql> alter table users add image_path varchar(100) comment '图片路径' after birthday;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc users;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| password | char(32) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| image_path | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> show create table users \G
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`password` char(32) DEFAULT NULL COMMENT '用户的密码',
`birthday` date DEFAULT NULL COMMENT '用户的生日',
`image_path` varchar(100) DEFAULT NULL COMMENT '图片路径'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
场景2:修改name,将其长度改成60(修改属性列)
mysql> alter table users add image_path varchar(100) comment '图片路径' after birthday;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
场景3:删除password列
注意:删除字段一定要小心,删除字段及其对应的列数据都没了
mysql> desc users;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(60) | YES | | NULL | |
| password | char(32) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| image_path | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> alter table users drop password;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc users;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(60) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| image_path | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
我们可以看到password属性不复存在
场景4:修改表名为employee
mysql> alter table users rename to User;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users;
ERROR 1146 (42S02): Table 'user.users' doesn't exist
mysql> select * from User;
+------+--------+------------+------------+
| id | name | birthday | image_path |
+------+--------+------------+------------+
| 1 | 张三 | 2002-08-07 | NULL |
| 2 | 李四 | 2000-07-07 | NULL |
+------+--------+------------+------------+
2 rows in set (0.00 sec)
to:可以省掉
将name列修改为xingming
mysql> alter table User change name xingming varchar(60);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc User;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| xingming | varchar(60) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| image_path | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
5. 删除表
语法格式:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
示例:
drop table t1;
数据库中的表迫不得已的情况下,最好不要进行修改和删除。
因为数据库属于底层模块,凡是基于数据库上层的软件开发,一旦进行底层的更改都有可能会导致上层应用无法运行。