mysql三:表操作

一、存储引擎介绍

  存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制。

  详见:点击查看

二、表的介绍

  表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段

    

  id,name,qq,age称为字段,其余的,一行内容称为一条记录

三、创建表

#语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);

#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
mysql> create  database db2 charset utf8; 
Query OK, 1 row affected (0.01 sec)

mysql> use db2
Database changed
mysql> create table t1(
    -> id int,
    -> name varchar(50),
    -> sex enum('male', 'female'),
    -> age int(3)
    -> );
Query OK, 0 rows affected (0.01 sec)

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

mysql> desc t1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql> select id,name,sex,age from t1;
Empty set (0.00 sec)

mysql> select * from t1;
Empty set (0.00 sec)
创表示例
mysql> insert into t1 values (1,'egon','male',18), (2,'alex','female',81);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+------+--------+------+
| id   | name | sex    | age  |
+------+------+--------+------+
|    1 | egon | male   |   18 |
|    2 | alex | female |   81 |
+------+------+--------+------+
2 rows in set (0.00 sec)

mysql> insert into t1(id) values
    -> (3),
    -> (4);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+------+--------+------+
| id   | name | sex    | age  |
+------+------+--------+------+
|    1 | egon | male   |   18 |
|    2 | alex | female |   81 |
|    3 | NULL | NULL   | NULL |
|    4 | NULL | NULL   | NULL |
+------+------+--------+------+
4 rows in set (0.00 sec)
往表中插入数据

  特别需要注意:字段匹配顺序和表中最后一个字段不能加逗号

四、查看表结构

mysql> describe t1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> show create table t1G;  # 查看表结构详细结构,可以添加G

  类似的show create table mysql.userG; 执行查看,可以解决在屏幕比较小时,“----”显示混乱的问题。

五、数据类型

  详见:点击插看

六、表完整性约束

  详见:点击查看

七、修改表结构

语法:
1. 修改表名
      ALTER TABLE 表名 
                          RENAME 新表名;

2. 增加字段
      ALTER TABLE 表名
                          ADD 字段名  数据类型 [完整性约束条件…],    # 添加多个字段
                          ADD 字段名  数据类型 [完整性约束条件…];
      ALTER TABLE 表名
                          ADD 字段名  数据类型 [完整性约束条件…]  FIRST;   # 添加新字段到第一个
      ALTER TABLE 表名
                          ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;   # 添加新字段到指定字段之后

3. 删除字段
      ALTER TABLE 表名 
                          DROP 字段名;

4. 修改字段————主要针对字段类型和字段名称
      ALTER TABLE 表名 
                          MODIFY  字段名 数据类型 [完整性约束条件…];    # 修改字段类型
      ALTER TABLE 表名 
                          CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];    # 修改字段名称
      ALTER TABLE 表名 
                          CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
示例:
mysql> use db2
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table service;
ERROR 1113 (42000): A table must have at least 1 column
mysql> create table service(id int);
Query OK, 0 rows affected (0.02 sec)

# 1、修改存储引擎
mysql> alter table service 
    -> engine=innodb;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create table student10(id int);               
Query OK, 0 rows affected (0.01 sec)

# 2、添加字段
mysql> alter table student10
    -> add name varchar(20) not null,
    -> add age int(3) not null default 22;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table student10
    -> add stu_num varchar(10) not null after name;    # after关键词,添加到name字段后
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table student10
    -> add sex enum('male', 'female') default 'male' first;    # first关键词,添加到最前面
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from student10;
Empty set (0.00 sec)

mysql> describe student10;    # 查看表结构
+---------+-----------------------+------+-----+---------+-------+
| Field   | Type                  | Null | Key | Default | Extra |
+---------+-----------------------+------+-----+---------+-------+
| sex     | enum('male','female') | YES  |     | male    |       |
| id      | int(11)               | YES  |     | NULL    |       |
| name    | varchar(20)           | NO   |     | NULL    |       |
| stu_num | varchar(10)           | NO   |     | NULL    |       |
| age     | int(3)                | NO   |     | 22      |       |
+---------+-----------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

# 3、删除字段
mysql> alter table student10
    -> drop sex;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table service add mac varchar(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table service drop mac;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe student10;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(20) | NO   |     | NULL    |       |
| stu_num | varchar(10) | NO   |     | NULL    |       |
| age     | int(3)      | NO   |     | 22      |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

# 4、修改字段类型modify
mysql> alter table student10
    -> modify age int(3);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table student10
    -> modify id int(11) not null primary key auto_increment;    # 修改为主键
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from student10;
Empty set (0.01 sec)

mysql> describe student10;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20) | NO   |     | NULL    |                |
| stu_num | varchar(10) | NO   |     | NULL    |                |
| age     | int(3)      | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

# 5、增加约束(针对已有的主键添加auto_increment)
mysql> alter table student10 modify id int(11) not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined

mysql> alter table student10 modify id int(11) not null auto_increment;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe student10;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20) | NO   |     | NULL    |                |
| stu_num | varchar(10) | NO   |     | NULL    |                |
| age     | int(3)      | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

# 6、对已经存在的表添加复合主键
mysql> alter table service 
    -> add host_ip varchar(24),
    -> add port int(4);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe service;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| host_ip | varchar(24) | YES  |     | NULL    |       |
| port    | int(4)      | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> alter table service
    -> add primary key(host_ip, port);    # 增加复合主键,经测试必须是这个字段存在
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe service;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| host_ip | varchar(24) | NO   | PRI | NULL    |       |
| port    | int(4)      | NO   | PRI | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

# 7、删除主键
# a.删除自增约束
mysql> describe student10;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20) | NO   |     | NULL    |                |
| stu_num | varchar(10) | NO   |     | NULL    |                |
| age     | int(3)      | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> alter table student10
    -> modify name varchar(10) not null primary key;
ERROR 1068 (42000): Multiple primary key defined
mysql> alter table student10
    -> drop primary key;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql> alter table student10
    -> modify id int(11) not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe student10;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| name    | varchar(20) | NO   |     | NULL    |       |
| stu_num | varchar(10) | NO   |     | NULL    |       |
| age     | int(3)      | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

# b.删除主键
mysql> alter table student10
    -> drop primary key;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe student10;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| name    | varchar(20) | NO   |     | NULL    |       |
| stu_num | varchar(10) | NO   |     | NULL    |       |
| age     | int(3)      | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)


# 8、添加主键(和删除主键挪移了位置,因为不想新增一个表)
mysql> alter table student10
    -> modify name varchar(10) not null primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe student10;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| name    | varchar(10) | NO   | PRI | NULL    |       |
| stu_num | varchar(10) | NO   |     | NULL    |       |
| age     | int(3)      | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

# 9、添加主键和自动增长(多主键是不允许的,主键是唯一,非空的但是可以多个字段联合成一个主键)
mysql> alter table student10
    -> modify id int not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined
mysql> alter table student10
    -> drop primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table student1
    -> modify id int not null primary key auto_increment;
ERROR 1146 (42S02): Table 'db2.student1' doesn't exist
mysql> alter table student10
    -> modify id int not null primary key auto_increment;    # 添加主键和自动增长成功
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe student10;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10) | NO   |     | NULL    |                |
| stu_num | varchar(10) | NO   |     | NULL    |                |
| age     | int(3)      | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
示例和练习

 八、复制表

1、复制表结构+记录

  key不会复制:主键、外键和索引。

  create table t1 select host,user from mysql.user;

mysql> select host, user from mysql.user;  
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
3 rows in set (0.00 sec)

mysql> create table t1 select host,user from mysql.user;   # 查询出结果不输出屏幕直接传给新表
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
3 rows in set (0.00 sec)

mysql> desc t1;   # 查看key是否复制
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| host  | char(60) | NO   |     |         |       |
| user  | char(32) | NO   |     |         |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

2、只复制表结构

  方法一:故意设置一个不成立的条件

mysql> select host,user from mysql.user where 1>5;      # 条件不成立,查不到任何数据  
Empty set (0.00 sec)

mysql> create table t2 select host,user from mysql.user where 1>5;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t2;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| host  | char(60) | NO   |     |         |       |
| user  | char(32) | NO   |     |         |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

  方法二:利用like

    create table t3 like mysql.user;

mysql> create table t3 like mysql.user;
Query OK, 0 rows affected (0.03 sec)

mysql> desc t3;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher             | blob                              | NO   |     | NULL                  |       |
| x509_issuer            | blob                              | NO   |     | NULL                  |       |
| x509_subject           | blob                              | NO   |     | NULL                  |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0                     |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0                     |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       |
| plugin                 | char(64)                          | NO   |     | mysql_native_password |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.00 sec)

mysql> select * from t3;
Empty set (0.01 sec)
create table t3 like mysql.user;

 九、删除表

  DROP TABLE 表名;

mysql> drop table t2;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+---------------+
| Tables_in_db3 |
+---------------+
| t1            |
+---------------+
1 row in set (0.00 sec)
原文地址:https://www.cnblogs.com/xiugeng/p/9016645.html