一、存储引擎介绍
存储引擎即表类型,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)
九、删除表
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)