【MySQL】表的相关操作

06-01 1217阅读
目录
  • 1. 表的创建
    • 1.1 创建表语法
    • 1.2 创建表案例
    • 1.3 查看表
    • 2. 表的修改
      • 2.1 修改表名
      • 2.2 插入数据
      • 2.3 新增一列
      • 2.4 修改某列
        • 2.4.1 修改列的类型
        • 2.4.2 修改列名
        • 2.5 删除某列
        • 3. 表的删除
        • 4. 注意

          1. 表的创建

          1.1 创建表语法

          create table student (
          列属性名1 列数据类型,
          列属性名2 列数据类型
          ) character set 字符集 collate 校验集 engine 存储引擎
          

          可以在最后指定字符集等,也可以不指定使用默认配置的

          也可以带选项,比如create table if not exists xxx;表示没有才创建

          还有一种写法,比如有一张a表,然后像创建一张结构与a表一样的b表时语法如下:

          create table b like a;
          

          1.2 创建表案例

          mysql> create table users ( 
          id int, 
          name varchar(20) comment '用户名',  
          password char(32) comment '32位密码',
          birthday date comment '生日'  
          ) charset=utf8mb4;
          

          int表示整形,varchar表示变长字符串类型,char表示定长字符串类型,date表示日期类型,而comment表示对当前列属性的一个说明

          当使用不同的存储引擎创建表时,最终在目录中所创建相关的文件个数是不同的,使用innoDB引擎时:

          root@VM-16-3-ubuntu:/var/lib/mysql/base# ls
          users.ibd
          

          使用MyISAM引擎时:

          root@VM-16-3-ubuntu:/var/lib/mysql/base# ls
          users_375.sdi  users.MYD  users.MYI
          

          1.3 查看表

          使用show可以查看当前数据库中存在的表:

          mysql> show tables;
          +----------------+
          | Tables_in_base |
          +----------------+
          | users          |
          +----------------+
          1 row in set (0.00 sec)
          

          前提是要在对应的数据库中

          要查看某个表的详细信息时使用desc:

          mysql> desc users;
          +----------+-------------+------+-----+---------+-------+
          | Field    | Type        | Null | Key | Default | Extra |
          +----------+-------------+------+-----+---------+-------+
          | id       | int         | YES  |     | NULL    |       |
          | name     | varchar(20) | YES  |     | NULL    |       |
          | password | char(32)    | YES  |     | NULL    |       |
          | birthday | date        | YES  |     | NULL    |       |
          +----------+-------------+------+-----+---------+-------+
          4 rows in set (0.01 sec) 
          

          从左到右分别表示的是:字段名称(列属性)、字段类型、是否允许为空、索引类型、默认值和扩充

          格式化显示带上G:desc users G;

          如果要查看更加详细的表信息是可以使用如下指令:

          mysql> show create table users;
          +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
          | Table | Create Table                             |
          +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
          | users | CREATE TABLE `users` (
            `id` int DEFAULT NULL,
            `name` varchar(20) DEFAULT NULL COMMENT '用户名',
            `password` char(32) DEFAULT NULL COMMENT '32位密码',
            `birthday` date DEFAULT NULL COMMENT '生日'
          ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci         |
          +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
          1 row in set (0.00 sec)
          

          格式化显示只需要把最后的冒号换成G:

          mysql> show create table users G
          *************************** 1. row ***************************
                 Table: users
          Create Table: CREATE TABLE `users` (
            `id` int DEFAULT NULL,
            `name` varchar(20) DEFAULT NULL COMMENT '用户名',
            `password` char(32) DEFAULT NULL COMMENT '32位密码',
            `birthday` date DEFAULT NULL COMMENT '生日'
          ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
          1 row in set (0.00 sec)
          

          这种做法相当于是把当初创建表时的有效操作给记录下来了,所以是最详细的,包含了说明和字符集等等,不过可以发现的时候上面的写法貌似和当初自己写的不太一样,这是因为mysqld要对命令进行语法和词法分析,并对其按照标准进行修改优化,最后再去执行优化后的命令,也就是上面这样

          2. 表的修改

          2.1 修改表名

          将表名user修改为us:

          【MySQL】表的相关操作
          (图片来源网络,侵删)
          mysql> alter table users rename to us;
          Query OK, 0 rows affected (0.03 sec)
          mysql> show tables;
          +----------------+
          | Tables_in_base |
          +----------------+
          | us             |
          +----------------+
          1 row in set (0.00 sec)
          

          其中to可以省略

          还有一种写法:

          【MySQL】表的相关操作
          (图片来源网络,侵删)
          rename table table_name_a to table_name_b [, ...]
          

          2.2 插入数据

          插入一条记录:

          mysql> insert into us values (1, 'lzh', '12345', '2003.9.10');
          

          也叫全列插入

          【MySQL】表的相关操作
          (图片来源网络,侵删)

          插入多条记录,中间使用逗号隔开

          如果只想插入其中几列时写法如下:

          mysql> insert into us (id, password) values (1, '12345');
          

          前面一个括号里填入需要写入的列名,后面则是对应的数据,但要注意的是,当使用指定列插入时,必须确保:

          • 指定的列名在表中存在
          • 提供的值的数量与指定的列的数量相匹配
          • 值的类型与对应列的数据类型兼容。

            而且如果表中有任何列被设置为not null且没有默认值,并且这些列没有被包括在insert语句中,那么将无法执行该insert操作,除非为这些列提供了默认值或允许它们接受null值

            查看表内容:

            mysql> select * from us;
            +------+------+----------+------------+
            | id   | name | password | birthday   |
            +------+------+----------+------------+
            |    1 | lzh  | 12345    | 2003-09-10 |
            |    1 | zz   | 12345    | 2003-09-10 |
            +------+------+----------+------------+
            

            2.3 新增一列

            假设新增一列用来保存存储路径:

            mysql> alter table us add path varchar(128) comment '路径' after birthday;
            Query OK, 4 rows affected (0.06 sec)
            Records: 4  Duplicates: 0  Warnings: 0
            mysql> select * from us;
            +------+------+----------+------------+------+
            | id   | name | password | birthday   | path |
            +------+------+----------+------------+------+
            |    1 | lzh  | 12345    | 2003-09-10 | NULL |
            |    1 | zz   | 12345    | 2003-09-10 | NULL |
            |    4 | lzh  | 12345    | 2003-09-10 | NULL |
            |    5 | pp   | 666      | 2024-09-19 | NULL |
            +------+------+----------+------------+------+
            4 rows in set (0.00 sec)
            

            新增并不会对之前列中的数据产生影响,只是新增列中的数据为空

            after xxx表示在xxx那一列之后添加

            2.4 修改某列

            2.4.1 修改列的类型

            将name列的数据类型改为varchar(60):

            mysql> alter table us modify name varchar(60);
            Query OK, 4 rows affected (0.05 sec)
            Records: 4  Duplicates: 0  Warnings: 0
            mysql> show create table us G;
            *************************** 1. row ***************************
                   Table: us
            Create Table: CREATE TABLE `us` (
              `id` int DEFAULT NULL,
              `name` varchar(60) DEFAULT NULL,
              `password` char(32) DEFAULT NULL COMMENT '32位密码',
              `birthday` date DEFAULT NULL COMMENT '生日',
              `path` varchar(128) DEFAULT NULL COMMENT '路径'
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
            1 row in set (0.00 sec)
            ERROR: 
            No query specifie
            

            可以发现,修改是直接覆盖最初的指令,把原来的属性和描述信息直接替换了

            2.4.2 修改列名

            把列名id改成user_id:

            mysql> alter table us change column id user_id int;
            Query OK, 0 rows affected (0.04 sec)
            Records: 0  Duplicates: 0  Warnings: 0
            mysql> desc us;
            +----------+--------------+------+-----+---------+-------+
            | Field    | Type         | Null | Key | Default | Extra |
            +----------+--------------+------+-----+---------+-------+
            | user_id  | int          | YES  |     | NULL    |       |
            | name     | varchar(60)  | YES  |     | NULL    |       |
            | password | char(32)     | YES  |     | NULL    |       |
            | birthday | date         | YES  |     | NULL    |       |
            | path     | varchar(128) | YES  |     | NULL    |       |
            +----------+--------------+------+-----+---------+-------+
            

            change column 旧列名 新列名 新数据类型和属性 (约束)

            column可以省略

            2.5 删除某列

            删除当前表中的password列:

            mysql> alter table user drop password;
            Query OK, 4 rows affected (0.03 sec)
            Records: 4  Duplicates: 0  Warnings: 0
            mysql> desc user;
            +----------+--------------+------+-----+---------+-------+
            | Field    | Type         | Null | Key | Default | Extra |
            +----------+--------------+------+-----+---------+-------+
            | user_id  | int          | YES  |     | NULL    |       |
            | name     | varchar(60)  | YES  |     | NULL    |       |
            | birthday | date         | YES  |     | NULL    |       |
            | path     | varchar(128) | YES  |     | NULL    |       |
            +----------+--------------+------+-----+---------+-------+
            mysql> select * from user;
            +---------+------+------------+------+
            | user_id | name | birthday   | path |
            +---------+------+------------+------+
            |       1 | lzh  | 2003-09-10 | NULL |
            |       1 | zz   | 2003-09-10 | NULL |
            |       4 | lzh  | 2003-09-10 | NULL |
            |       5 | pp   | 2024-09-19 | NULL |
            +---------+------+------------+------+
            

            删除某列后,该列对应的数据也被删掉了

            3. 表的删除

            语法类似库的删除,很简单,drop table xxx:

            mysql> show tables;
            +----------------+
            | Tables_in_base |
            +----------------+
            | stu            |
            | user           |
            +----------------+
            2 rows in set (0.00 sec)
            mysql> drop table stu;
            Query OK, 0 rows affected (0.04 sec)
            mysql> show tables;
            +----------------+
            | Tables_in_base |
            +----------------+
            | user           |
            +----------------+
            1 row in set (0.00 sec)
            

            也可以带选项,比如drop table if exists xxx;存在才删除

            4. 注意

            和库一样,不要轻易对表进行修改和删除,因为数据库是比较接近底层的,上层程序可能有很多地方都要用到这个数据库以及对应的表,如果你把名字改了,那上层都得跟着改,降低了维护性

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码