基于Linux的MySQL操作实例(修改表结构,MySQL索引,MySQL数据引擎)
前言
本篇是基于Linux下针对MySQL表结构的修改,MySQL索引的操作以及MySQL数据引擎的配置和说明。
本篇结合上一篇文档,基于Linux的MySQL操作实例(软件安装,mysql基本操作,mysql数据类型,建表、插入数据操作)
若是有兴趣的朋友可以去看看。
http://www.jianshu.com/p/444482ff5986
根据本人的一贯风格,本篇依旧是前面就这几点做一些概述,并不会涉及太多的概念或理论,大篇幅的进行实际的命令实例操作。
最后依旧欢迎各路大神批评指教,鄙人不胜感激。谢谢大家。
修改数据库表结构
alter table 表名 执行动作;
执行动作:
- 添加新字段(add)
- 删除已有字段(drop)
- 修改字段类型(modify)
- 修改字段名(change)
语法格式
添加新字段
add 添加新字段
add 字段名 类型(宽度);
add 字段名 类型(宽度) 约束条件 ;
add 字段名 类型(宽度) 约束条件 first;
add 字段名 类型(宽度) 约束条件 after 字段名;
eg:
alter table t1 add class char(7) default "nsd1609" first,add tel char(11) ,add sex enum ("boy","girl") default "boy" after name;
删除字段
drop 删除字段
drop 字段名
eg:
alter table t1 drop name,drop sex;
修改字段类型
modify 修改字段类型
不能与字段已经存储的数据冲突
modify 字段名 类型(宽度) 约束条件;
eg:
mysql> alter table t1
-> modify
-> sex enum("boy","girl","no") not null default "no";
修改字段名
change 修改字段名
change 原字段名 新字段名 类型(宽度) 约束条件;
eg:
alter table t1 change tel iphone char(11);
修改表名
alter table 原表名 rename [to] 新表名;
eg:
alter table t1 rename t111;
mysql索引
概述
索引:相当于 "书的目录"
- 索引的优点
- 加快查询记录的速度.
- 索引的缺点
- 会减慢写的速度( insert update delete ).
- 占用物理存储空间.
在表里建索引 设置在字段上
索引类型
- 普通索引 index
- 唯一索引 unique
- 主键 primary key
- 外键 foreign key
- 全文索引 fulltext
使用索引
- 查看
- 创建
- 使用规则
- 删除
查看索引
- desc 表名; ---> 显示结果中的Key列即是索引值
- show index from 表名\G;
Table: user
Column_name: Host
Key_name: PRIMARY //即是索引值
Index_type: BTREE //共有三种:BTREE(二叉树),B+tree,hash
index普通索引的使用规则
- 一个表中可以有多个INDEX字段
- 字段的值允许有重复,且可以赋NULL值
- 经常把做查询条件的字段设置为INDEX字段
- INDEX字段的KEY标志是MUL
创建普通索引
1.在已有表里创建index字段
create index 索引名 on 表名(字段名);
create index sex on t111(sex);
2.建表时创建index字段
create table 表名 (
字段名列表,
index(字段名),index(字段名)
);
删除普通索引
drop index 索引名 on 表名;
drop index sex on t24;
primary key主键的使用规则
- 一个表中只能有一个primary key字段
- 对应的字段值不允许有重复,且不允许赋NULL值
- 如果有多个字段都作为PRIMARY KEY,称为复合主键,必须一起创建。
- 主键字段的KEY标志是PRI
- 通常与 AUTO_INCREMENT 连用
- 经常把表中能够唯一标识记录的字段设置为主键字段[记录编号字段]
建表时创建主键字段
create table t25( name char(10), age int(2), primary key(name));
create table t26( name char(10) primary key, age int(2));
删除主键
alter table 表名 drop primary key;
在已有表里创建主键
alter table 表名 add primary key(字段名);
复合主键的使用
多个字段一起做主键是复合主键 必须一起创建。
字段的值不允许同时相同。
建表时创建:
create table t29(host char(10),db char(10),user char(10),primary key(host,db,user));
对已有的表进行添加:
alter table t29 add primary key(host,user,db);
通常和aUTO_INCREMENT 连用,实现字段值的字段增长
经常把表中能够唯一标识记录的字段设置为主键字段[记录编号字段]
唯一索引 unique
- 字段的值可以为Null 但不可以重复
- 一个表里可以有多个unique字段
- 标志 UNI
一般使用于:姓名,身份证,考试证,护照,驾驶证
建表时创建:
create table t29(
name char(10),
stu_id char(9),
age int(2),
unique(stu_id)
);
在已有表里创建unique字段
create unique index 索引名 on 表名(字段名);
create unique index stu_id on t29(stu_id);
外键(foreign key)
功能:
让当前表某个字段的值,在另一个表某个字段值的范围内选择。
使用规则:
- 表的存储引擎必须是innodb
- 字段的数据类型要匹配
- 被参考的字段必须是key 中的一种 (primary key)
create table jfb(
jfb_id int(2) primary key auto_increment,
name char(10),
pay float(7,2)
)engine=innodb;
create table bjb(
bjb_id int(2),
name char(10),
foreign key(bjb_id) references jfb(jfb_id) on update cascade on delete cascade
)engine=innodb;
删除外键
show create table 表名;
alter table 表名 drop foreign key 外键名;
alter table bjb drop foreign key bjb_ibfk_1;
mysql存储引擎
概述
存储引擎:
表的处理器,是mysql数据库服务软件自动程序,不同处理器有不同的功能和数据存储方式。
基本操作
- 查看数据库服务支持哪些存储引擎:
show engines;
InnoDB DEFAULT
- 修改mysql数据库服务默认使用的存储引擎:
vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
service mysql restart
- 建表时指定表使用的存储引擎
create table t31(name char(10))engine=memory;
- 修改表使用的存储引擎
alter table 表名 engine=存储引擎名;
eg:
alter table t31 engine=innodb;
-
查看表使用的存储引擎
show create table 表名; -
工作中使用哪种存储引擎?
- myisam
- innodb
-
myisam的特点
- 独享表空间
- t1.frm 表结构
- t1.MYD 表记录
- t1.MYI 表索引
-
innodb的特点
- 支持行级锁
- 支持外键 、 事务 、事务回滚
- 共享表空间
- t3.frm 表结构
- t3.ibd 表记录+表索引
事务
事务:一次sql操作从开始到结束的过程。
事务回滚:执行一次事务,只要执行过程中,任何一步执行失败,就恢复之前所有的sql操作。
事务日志文件记录对所有inondb存储引擎的表执行过的sql命令。
ibdata1 记录sql命令产生的数据信息
ib_logfile0----|
|---> 记录SQL 命令
ib_logfile1----|
锁机制
锁机制是为了解决客户端的并发访问冲突问题。
锁粒度: 表级锁 行级锁 页级锁
锁类型:
- 读锁 (共享锁) select * from t1;
- 写锁 (互斥锁 排它锁)
建表时如何决定表使用的存储引擎:
执行写操作多的表适合使用inondb存储引擎,这样并发访问大。
执行读操作多的表适合使用myisam存储引擎.
实例操作(前面基本描述的具体实现)
//进入mysql数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| game_db |
| mysql |
| performance_schema |
| test |
| user_db |
+--------------------+
6 rows in set (0.00 sec)
mysql> use user_db;
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> show tables;
+-------------------+
| Tables_in_user_db |
+-------------------+
| user_list |
+-------------------+
1 row in set (0.00 sec)
mysql> desc user_list;
+-----------+-------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------------------------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| u_name | char(10) | NO | | NULL | |
| u_sex | enum('boy','girl') | NO | | NULL | |
| u_subject | enum('computer','chinese','engish') | NO | | NULL | |
| u_grade | double(6,2) | NO | | NULL | |
+-----------+-------------------------------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
//添加字段
mysql> alter table user_list add
-> mail2 varchar(25) default "stuff@wolf.cn";
Query OK, 0 rows affected (0.91 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from user_list;
Empty set (0.00 sec)
mysql> desc user_list;
+-----------+-------------------------------------+------+-----+---------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------------------------------+------+-----+---------------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| u_name | char(10) | NO | | NULL | |
| u_sex | enum('boy','girl') | NO | | NULL | |
| u_subject | enum('computer','chinese','engish') | NO | | NULL | |
| u_grade | double(6,2) | NO | | NULL | |
| mail1 | varchar(25) | YES | | NULL | |
| mail2 | varchar(25) | YES | | stuff@wolf.cn | |
+-----------+-------------------------------------+------+-----+---------------+----------------+
7 rows in set (0.00 sec)
mysql> alter table user_list add
-> u_id char(11) not null first ;
Query OK, 0 rows affected (0.80 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user_list;
+-----------+-------------------------------------+------+-----+---------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------------------------------+------+-----+---------------+----------------+
| u_id | char(11) | NO | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| u_name | char(10) | NO | | NULL | |
| u_sex | enum('boy','girl') | NO | | NULL | |
| u_subject | enum('computer','chinese','engish') | NO | | NULL | |
| u_grade | double(6,2) | NO | | NULL | |
| mail1 | varchar(25) | YES | | NULL | |
| mail2 | varchar(25) | YES | | stuff@wolf.cn | |
+-----------+-------------------------------------+------+-----+---------------+----------------+
8 rows in set (0.00 sec)
mysql> insert into user_list(u_id,u_name,u_sex,u_subject,u_grade,mail1) values( 1,"tom","boy","computer","200.00","123456@aliyun.com");
Query OK, 1 row affected (0.07 sec)
mysql> insert into user_list(u_id,u_name,u_sex,u_subject,u_grade,mail1) values( 2,"jerry","boy","chinese","300.00","654321@aliyun.com");
Query OK, 1 row affected (0.03 sec)
mysql> insert into user_list(u_id,u_name,u_sex,u_subject,u_grade,mail1) values( 3,"cool","boy","chinese","240.00","654321@aliyun.com");
Query OK, 1 row affected (0.15 sec)
mysql> select * from user_list;
+------+----+--------+-------+-----------+---------+-------------------+---------------+
| u_id | id | u_name | u_sex | u_subject | u_grade | mail1 | mail2 |
+------+----+--------+-------+-----------+---------+-------------------+---------------+
| 1 | 1 | tom | boy | computer | 200.00 | 123456@aliyun.com | stuff@wolf.cn |
| 2 | 2 | jerry | boy | chinese | 300.00 | 654321@aliyun.com | stuff@wolf.cn |
| 3 | 3 | cool | boy | chinese | 240.00 | 654321@aliyun.com | stuff@wolf.cn |
+------+----+--------+-------+-----------+---------+-------------------+---------------+
3 rows in set (0.00 sec)
//删除字段
mysql> alter table user_list drop mail1,drop u_id;
Query OK, 0 rows affected (0.78 sec)
mysql> alter table user_list add homeaddr char(50);
Query OK, 0 rows affected (0.66 sec)
Records: 0 Duplicates: 0 Warnings: 0
//改变字段名
mysql> alter table user_list change mail2 mailaddr varchar(25) default "userinfo@aliyun.com"
-> ;
mysql> alter table user_list rename user_info;
Query OK, 0 rows affected (0.20 sec)
mysql> show tables;
+-------------------+
| Tables_in_user_db |
+-------------------+
| user_info |
+-------------------+
1 row in set (0.00 sec)
mysql> modify u_grade double(7,2) not null ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'modify u_grade double(7,2) not null' at line 1
mysql> alter table user_info modify u_grade double(7,2) not null ;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
//修改字段参数
mysql> alter table user_info modify u_grade float(3,2) not null;
ERROR 1264 (22003): Out of range value for column 'u_grade' at row 1
mysql> select u_name,u_grade from user_info;
+--------+---------+
| u_name | u_grade |
+--------+---------+
| tom | 200.00 |
| jerry | 300.00 |
| cool | 240.00 |
+--------+---------+
3 rows in set (0.00 sec)
mysql> alter table user_info add tel char(15) not null,add phone char(11) ;
Query OK, 0 rows affected (0.73 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into user_info(u_name,u_sex,u_subject,u_grade,mailaddr,homeaddr,tel,phone) values( "uzi","boy","computer","3000.00",NULL,NULL,"123456789",NULL);
mysql> select * from user_info;
+----+--------+-------+-----------+---------+---------------+----------+-----------+-------+
| id | u_name | u_sex | u_subject | u_grade | mailaddr | homeaddr | tel | phone |
+----+--------+-------+-----------+---------+---------------+----------+-----------+-------+
| 1 | tom | boy | computer | 200.00 | stuff@wolf.cn | NULL | | NULL |
| 2 | jerry | boy | chinese | 300.00 | stuff@wolf.cn | NULL | | NULL |
| 3 | cool | boy | chinese | 240.00 | stuff@wolf.cn | NULL | | NULL |
| 4 | uzi | boy | computer | 3000.00 | NULL | NULL | 123456789 | NULL |
+----+--------+-------+-----------+---------+---------------+----------+-----------+-------+
4 rows in set (0.00 sec)
mysql> desc user_info;
+-----------+-------------------------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------------------------------+------+-----+---------------------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| u_name | char(10) | NO | | NULL | |
| u_sex | enum('boy','girl') | NO | | NULL | |
| u_subject | enum('computer','chinese','engish') | NO | | NULL | |
| u_grade | double(7,2) | NO | | NULL | |
| mailaddr | varchar(25) | YES | | userinfo@aliyun.com | |
| homeaddr | char(50) | YES | | NULL | |
| tel | char(15) | NO | | NULL | |
| phone | char(11) | YES | | NULL | |
+-----------+-------------------------------------+------+-----+---------------------+----------------+
9 rows in set (0.00 sec)
mysql> alter table user_info modify phone char(11) not null;
ERROR 1138 (22004): Invalid use of NULL value
mysql> alter table user_info modify mailaddr varchar(25) not null;
ERROR 1138 (22004): Invalid use of NULL value
//index索引操作实例
mysql> create index u_name on user_info(u_name);
Query OK, 0 rows affected (0.61 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create table tab1 (
-> id char(10),
-> name char(15),
-> age int,
-> index(name),
-> index(age)
-> );
Query OK, 0 rows affected (0.86 sec)
mysql> desc tab1;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | char(10) | YES | | NULL | |
| name | char(15) | YES | MUL | NULL | |
| age | int(11) | YES | MUL | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> show index from tab1;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tab1 | 1 | name | 1 | name | A | 0 | NULL | NULL | YES | BTREE | | |
| tab1 | 1 | age | 1 | age | A | 0 | NULL | NULL | YES | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
mysql> show index from tab1 \G;
*************************** 1. row ***************************
Table: tab1
Non_unique: 1
Key_name: name
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: tab1
Non_unique: 1
Key_name: age
Seq_in_index: 1
Column_name: age
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
ERROR:
No query specified
mysql> drop index age on tab1;
Query OK, 0 rows affected (0.19 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tab1;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | char(10) | YES | | NULL | |
| name | char(15) | YES | MUL | NULL | |
| age | int(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
//主键 primary key操作实例
mysql> create table tab2 (id int primary key ,name char(10));
Query OK, 0 rows affected (0.67 sec)
mysql> desc tab2;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> create table tab3 (id int(2), name char(10), primary key(id));
Query OK, 0 rows affected (0.79 sec)
mysql> desc tab3;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(2) | NO | PRI | 0 | |
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table tab3 drop primary key;
Query OK, 0 rows affected (1.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tab3;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(2) | NO | | 0 | |
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> create table tab4 (
-> cip char(16),
-> port int(2),
-> status enum("deny","allow") default "deny"
-> );
Query OK, 0 rows affected (0.65 sec)
mysql> desc tab4
-> ;
+--------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+---------+-------+
| cip | char(16) | YES | | NULL | |
| port | int(2) | YES | | NULL | |
| status | enum('deny','allow') | YES | | deny | |
+--------+----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table tab4 add primary key(cip,port);
Query OK, 0 rows affected (1.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tab4;
+--------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+---------+-------+
| cip | char(16) | NO | PRI | | |
| port | int(2) | NO | PRI | 0 | |
| status | enum('deny','allow') | YES | | deny | |
+--------+----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into tab4 values("1.1.1.1",22,"deny");
Query OK, 1 row affected (0.05 sec)
mysql> insert into tab4 values("1.1.1.1",25,"allow");
Query OK, 1 row affected (0.07 sec)
mysql> insert into tab4 values("1.1.1.1",22,"allow");
ERROR 1062 (23000): Duplicate entry '1.1.1.1-22' for key 'PRIMARY'
mysql> insert into tab4 values("2.1.1.1",22,"deny");
Query OK, 1 row affected (0.04 sec)
mysql> select * from tab4;
+---------+------+--------+
| cip | port | status |
+---------+------+--------+
| 1.1.1.1 | 22 | deny |
| 1.1.1.1 | 25 | allow |
| 2.1.1.1 | 22 | deny |
+---------+------+--------+
3 rows in set (0.00 sec)
//删除tab4表的主键
mysql> alter table tab4 drop primary key;
Query OK, 3 rows affected (1.16 sec)
Records: 3 Duplicates: 0 Warnings: 0
//当没有主键约束后,相同数据可以添加成功
mysql> insert into tab4 values("1.1.1.1",22,"allow");
Query OK, 1 row affected (0.07 sec)
mysql> insert into tab4 values("1.1.1.1",25,"allow");
Query OK, 1 row affected (0.04 sec)
//重新添加主键,由于表中已经存在不符合约束条件的数据,所以无法添加主键成功
mysql> alter table tab4 add primary key(cip,port);
ERROR 1062 (23000): Duplicate entry '1.1.1.1-22' for key 'PRIMARY'
//删除不符合数据
mysql> delete from tab4 where port=22;
Query OK, 3 rows affected (0.04 sec)
mysql> alter table tab4 add primary key(cip,port);
ERROR 1062 (23000): Duplicate entry '1.1.1.1-25' for key 'PRIMARY'
mysql> delete from tab4 where port=25;
Query OK, 2 rows affected (0.08 sec)
//主键添加成功
mysql> alter table tab4 add primary key(cip,port);
Query OK, 0 rows affected (0.80 sec)
Records: 0 Duplicates: 0 Warnings: 0
//可以直接在创建表时就指定复合主键,主键个数可以多个,语法格式不变
mysql> create table tab5 (u_id int ,name char(10),other char(40),primary key(u_id,name));
Query OK, 0 rows affected (0.63 sec)
mysql> desc tab5;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| u_id | int(11) | NO | PRI | 0 | |
| name | char(10) | NO | PRI | | |
| other | char(40) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
//自增 auto_increment 只能修饰主键,必须是数值类型,最好是整形
mysql> create table tab6 (id int(2) zerofill primary key auto_increment,
-> name char(10) not null,
-> age tinyint(2) not null default 18
-> , sex enum("boy","girl") default "boy",
-> other char(50));
Query OK, 0 rows affected (0.65 sec)
mysql> desc tab6;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+----------------+
| id | int(2) unsigned zerofill | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | | NULL | |
| age | tinyint(2) | NO | | 18 | |
| sex | enum('boy','girl') | YES | | boy | |
| other | char(50) | YES | | NULL | |
+-------+--------------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
//插入数据
mysql> insert into tab6(name,age,sex,other) values("tom",12,"boy","This is Tom");
Query OK, 1 row affected (0.02 sec)
mysql> insert into tab6(name,age,sex,other) values("jerry",14,"boy","This is Jerry");
Query OK, 1 row affected (0.05 sec)
mysql> insert into tab6(name,age,sex,other) values("natasha",17,"girl","This is natasha.");
Query OK, 1 row affected (0.10 sec)
mysql> select * from tab6;
+----+---------+-----+------+------------------+
| id | name | age | sex | other |
+----+---------+-----+------+------------------+
| 01 | tom | 12 | boy | This is Tom |
| 02 | jerry | 14 | boy | This is Jerry |
| 03 | natasha | 17 | girl | This is natasha. |
+----+---------+-----+------+------------------+
3 rows in set (0.00 sec)
mysql> insert into tab6 values (7,"cool",22,"boy","This is cool");
Query OK, 1 row affected (0.05 sec)
//会根据表中最大的数字进行自增计算
mysql> insert into tab6(name,age,sex,other) values("uzi",19,"boy","This is uzi.");
Query OK, 1 row affected (0.05 sec)
mysql> select * from tab6;
+----+---------+-----+------+------------------+
| id | name | age | sex | other |
+----+---------+-----+------+------------------+
| 01 | tom | 12 | boy | This is Tom |
| 02 | jerry | 14 | boy | This is Jerry |
| 03 | natasha | 17 | girl | This is natasha. |
| 07 | cool | 22 | boy | This is cool |
| 08 | uzi | 19 | boy | This is uzi. |
+----+---------+-----+------+------------------+
5 rows in set (0.00 sec)
//删除所有数据后,再次添加新值
mysql> delete from tab6;
Query OK, 5 rows affected (0.07 sec)
mysql> select * from tab6;
Empty set (0.00 sec)
mysql> insert into tab6(name,age,sex,other) values("uzi",19,"boy","This is uzi.");
Query OK, 1 row affected (0.06 sec)
mysql> insert into tab6(name,age,sex,other) values("uzi",19,"boy","This is uzi.");
Query OK, 1 row affected (0.03 sec)
//内部有计数器,会按照上次结果继续增加,这样可以保证数据不会出现重复
mysql> select * from tab6;
+----+------+-----+------+--------------+
| id | name | age | sex | other |
+----+------+-----+------+--------------+
| 09 | uzi | 19 | boy | This is uzi. |
| 10 | uzi | 19 | boy | This is uzi. |
+----+------+-----+------+--------------+
2 rows in set (0.00 sec)
//unique约束实例
//创建表时,unique参数需要分开创建
mysql> create table tab7 (id int(2) zerofill primary key auto_increment,
-> per_id char(9),
-> car_id char(7),
-> unique(per_id,car_id)
-> );
Query OK, 0 rows affected (0.85 sec)
mysql> desc tab7;
+--------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+----------------+
| id | int(2) unsigned zerofill | NO | PRI | NULL | auto_increment |
| per_id | char(9) | YES | MUL | NULL | |
| car_id | char(7) | YES | | NULL | |
+--------+--------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
//删除表,重新创建表
mysql> drop table tab7;
Query OK, 0 rows affected (0.23 sec)
mysql> create table tab7 (id int(2) zerofill primary key auto_increment, per_id char(9), car_id char(7), unique(per_id),unique(car_id) );
Query OK, 0 rows affected (0.88 sec)
mysql> desc tab7;
+--------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+----------------+
| id | int(2) unsigned zerofill | NO | PRI | NULL | auto_increment |
| per_id | char(9) | YES | UNI | NULL | |
| car_id | char(7) | YES | UNI | NULL | |
+--------+--------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> insert into tab7(per_id,car_id) values("123456789","1234567");
Query OK, 1 row affected (0.05 sec)
mysql> insert into tab7(per_id,car_id) values(NULL,"1234567");
ERROR 1062 (23000): Duplicate entry '1234567' for key 'car_id'
mysql> insert into tab7(per_id,car_id) values(NULL,"7654321");
Query OK, 1 row affected (0.05 sec)
mysql> insert into tab7(per_id,car_id) values(NULL,NULL);
Query OK, 1 row affected (0.04 sec)
mysql> select * from tab7;
+----+-----------+---------+
| id | per_id | car_id |
+----+-----------+---------+
| 01 | 123456789 | 1234567 |
| 03 | NULL | 7654321 |
| 04 | NULL | NULL |
+----+-----------+---------+
3 rows in set (0.00 sec)
mysql> insert into tab7(per_id,car_id) values("123456789","1234567");
Query OK, 1 row affected (0.05 sec)
mysql> insert into tab7(per_id,car_id) values(NULL,"1234567");
ERROR 1062 (23000): Duplicate entry '1234567' for key 'car_id'
mysql> insert into tab7(per_id,car_id) values(NULL,"7654321");
Query OK, 1 row affected (0.05 sec)
mysql> insert into tab7(per_id,car_id) values(NULL,NULL);
Query OK, 1 row affected (0.04 sec)
mysql> select * from tab7;
+----+-----------+---------+
| id | per_id | car_id |
+----+-----------+---------+
| 01 | 123456789 | 1234567 |
| 03 | NULL | 7654321 |
| 04 | NULL | NULL |
+----+-----------+---------+
3 rows in set (0.00 sec)
mysql> insert into tab7(per_id,car_id) values(NULL,NULL);
Query OK, 1 row affected (0.04 sec)
mysql> insert into tab7(per_id,car_id) values("012345678","1234567");
ERROR 1062 (23000): Duplicate entry '1234567' for key 'car_id'
mysql> alter table tab7 drop index car_id;
Query OK, 0 rows affected (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into tab7(per_id,car_id) values("012345678","1234567");
Query OK, 1 row affected (0.05 sec)
mysql> insert into tab7(per_id,car_id) values("012345678","1234567");
mysql> create unique index car_id on tab7(car_id);
ERROR 1062 (23000): Duplicate entry '1234567' for key 'car_id'
mysql> desc tab7;
+--------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+----------------+
| id | int(2) unsigned zerofill | NO | PRI | NULL | auto_increment |
| per_id | char(9) | YES | UNI | NULL | |
| car_id | char(7) | YES | | NULL | |
+--------+--------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> select * from tab7;
+----+-----------+---------+
| id | per_id | car_id |
+----+-----------+---------+
| 01 | 123456789 | 1234567 |
| 03 | NULL | 7654321 |
| 04 | NULL | NULL |
| 05 | NULL | NULL |
| 07 | 012345678 | 1234567 |
+----+-----------+---------+
5 rows in set (0.00 sec)
mysql> delete from tab7 where per_id=012345678;
Query OK, 1 row affected (0.05 sec)
mysql> create unique index car_id on tab7(car_id);
Query OK, 0 rows affected (0.73 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tab7;
+--------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+----------------+
| id | int(2) unsigned zerofill | NO | PRI | NULL | auto_increment |
| per_id | char(9) | YES | UNI | NULL | |
| car_id | char(7) | YES | UNI | NULL | |
+--------+--------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
//外键操作实例
//由于使用的是MySQL5.6版本,默认的存储引擎即是:innodb
//该默认的存储引擎根据数据库的版本有所不同。
//创建员工表
mysql> create table work_tab (w_id int(4) zerofill primary key auto_increment,
-> name char(10) not null,
-> sex enum("man","woman") default "man",
-> detials char(40) default ""
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> desc work_tab;
+---------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------------------+------+-----+---------+----------------+
| w_id | int(4) unsigned zerofill | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | | NULL | |
| sex | enum('man','woman') | YES | | man | |
| detials | char(40) | YES | | | |
+---------+--------------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
//插入测试数据
mysql> insert into work_tab(name,sex,detials) values("tom","man","This is tom.");
Query OK, 1 row affected (0.00 sec)
mysql> insert into work_tab(name,sex,detials) values("jack","man","This is jack.");
Query OK, 1 row affected (0.00 sec)
mysql> insert into work_tab(name,sex,detials) values("natasha","woman","This is natasha.");
Query OK, 1 row affected (0.00 sec)
/*
创建工资表,将该表的p_id与员工表的w_id进行外键绑定,即用来标识唯一用户(员工)
mysql>
*/
mysql> create table pay_tab (p_id int(4) zerofill , name char(10) not null ,
-> pays double(8,2) not null, others char(30) default "" ,
-> foreign key(p_id) references work_tab(w_id) on update cascade on delete cascade)
-> engine=innodb;
mysql> desc pay_tab;
+--------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| p_id | int(4) unsigned zerofill | YES | MUL | NULL | |
| name | char(10) | NO | | NULL | |
| pays | double(8,2) | NO | | NULL | |
| others | char(30) | YES | | | |
+--------+--------------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
//查看建表过程,验证创建表的结果是否正确
mysql> show create table pay_tab\G;
*************************** 1. row ***************************
Table: pay_tab
Create Table: CREATE TABLE `pay_tab` (
`p_id` int(4) unsigned zerofill DEFAULT NULL,
`name` char(10) NOT NULL,
`pays` double(8,2) NOT NULL,
`others` char(30) DEFAULT '',
KEY `p_id` (`p_id`),
CONSTRAINT `pay_tab_ibfk_1` FOREIGN KEY (`p_id`) REFERENCES `work_tab` (`w_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> select * from work_tab;
+------+---------+-------+------------------+
| w_id | name | sex | detials |
+------+---------+-------+------------------+
| 0001 | tom | man | This is tom. |
| 0002 | jack | man | This is jack. |
| 0003 | natasha | woman | This is natasha. |
+------+---------+-------+------------------+
3 rows in set (0.00 sec)
//向工资表插入在员工表存在的数据,可以插入
mysql> insert into pay_tab values(2,"jack",9000.00,"jack pays");
Query OK, 1 row affected (0.06 sec)
//向工资表插入在员工表不存在的数据,受外键约束无法插入
mysql> insert into pay_tab values(4,"bob",8000.00,"jack pays");
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`user_db`.`pay_tab`, CONSTRAINT `pay_tab_ibfk_1` FOREIGN KEY (`p_id`) REFERENCES `work_tab` (`w_id`) ON DELETE CASCADE ON UPDATE CASCADE)
//由于目前进行的约束仅仅是id,所以当向工资表插入数据时,name不一致的情况下,依旧可以插入
//一般我们在这里编写的SQL指令,一般都是由开发进行操作的,在开发操作时,一般都是去员工表查询对应的用户,然后将查询的结果和新值进行添加操作,这样一般是不会出现该错误
mysql> insert into pay_tab values(3,"wolf",10000.00,"wolf or natasha??");
Query OK, 1 row affected (0.08 sec)
//删除受约束表的记录时,可以正常操作,并且不会对员工表产生影响
mysql> delete from pay_tab where name="jack";
Query OK, 1 row affected (0.05 sec)
mysql> select * from pay_tab;
+------+------+----------+-------------------+
| p_id | name | pays | others |
+------+------+----------+-------------------+
| 0003 | wolf | 10000.00 | wolf or natasha?? |
+------+------+----------+-------------------+
1 row in set (0.00 sec)
mysql> insert into pay_tab values("tom",6000.00,"tom pays");
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into pay_tab values(1,"tom",6000.00,"tom pays");
Query OK, 1 row affected (0.06 sec)
mysql> select * from work_tab;
+------+---------+-------+------------------+
| w_id | name | sex | detials |
+------+---------+-------+------------------+
| 0001 | tom | man | This is tom. |
| 0002 | jack | man | This is jack. |
| 0003 | natasha | woman | This is natasha. |
+------+---------+-------+------------------+
3 rows in set (0.00 sec)
mysql> select * from pay_tab;
+------+------+----------+-------------------+
| p_id | name | pays | others |
+------+------+----------+-------------------+
| 0003 | wolf | 10000.00 | wolf or natasha?? |
| 0001 | tom | 6000.00 | tom pays |
+------+------+----------+-------------------+
2 rows in set (0.00 sec)
//在定义外键取值范围的表(work_tab员工表)删除数据时,对应的受外键约束的表(工资表)的对应记录也会被删除
mysql> delete from work_tab where name="tom";
Query OK, 1 row affected (0.04 sec)
mysql> select * from pay_tab;
+------+------+----------+-------------------+
| p_id | name | pays | others |
+------+------+----------+-------------------+
| 0003 | wolf | 10000.00 | wolf or natasha?? |
+------+------+----------+-------------------+
1 row in set (0.00 sec)
mysql> select * from work_tab;
+------+---------+-------+------------------+
| w_id | name | sex | detials |
+------+---------+-------+------------------+
| 0002 | jack | man | This is jack. |
| 0003 | natasha | woman | This is natasha. |
+------+---------+-------+------------------+
2 rows in set (0.00 sec)
//在受外键约束的表中(pay_tab工资表),删除不受外键约束的字段时,可以正常删除
mysql> alter table pay_tab drop name;
Query OK, 0 rows affected (1.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
//删除受约束的字段,无法成功,会被告知外键约束
mysql> alter table pay_tab drop p_id;
ERROR 1553 (HY000): Cannot drop index 'p_id': needed in a foreign key constraint
//当删除外键约束的定义或直接删除外键字段,即可删除员工表或员工表内对应的记录
mysql> alter table pay_tab drop foreign key pay_tab_ibfk_1;
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0
//mysql> drop table pay_tab;
mysql> drop table work_tab;
Query OK, 0 rows affected (0.28 sec)
//存储引擎操作实例
//default所在的行即是当前默认的存储引擎,Support表示当前可以使用,为NO即表示不可使用,
//Transactions 表示存储引擎不支持事务,Comment表示描述信息
//查看当前MySQL支持的数据引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
//不同的存储引擎生成的表文件也不同
.frm ---> 存放表结构
//指定不同的数据引擎创建数据表
mysql> create table tab8(id int)engine=MyISAM;
Query OK, 0 rows affected (0.11 sec)
mysql> create table tab9(id int)engine=MEMORY;
Query OK, 0 rows affected (0.11 sec)
mysql> create table tab9(id int)engine=InnoDB;
ERROR 1050 (42S01): Table 'tab9' already exists
mysql> create table tab10(id int)engine=InnoDB;
Query OK, 0 rows affected (0.56 sec)
//退出mysql,进入文件目录,查看对应文件
[root@mysql user_db]# pwd
/var/lib/mysql/user_db
[root@mysql user_db]# ls tab8*
tab8.frm tab8.MYD tab8.MYI
[root@mysql user_db]# ls tab9*
tab9.frm //临时表,存放到内存中,当系统将内存收回,即停止mysql服务时,该表数据丢失。
[root@mysql user_db]# ls tab10*
tab10.frm tab10.ibd //共享表空间
//查看建表过程
mysql> show create tab9;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tab9' at line 1
mysql> show create table tab9;
+-------+------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------+
| tab9 | CREATE TABLE `tab9` (
`id` int(11) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table tab9 engine=innodb;
Query OK, 0 rows affected (0.64 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table tab9;
+-------+------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------+
| tab9 | CREATE TABLE `tab9` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
//修改mysql默认的数据引擎
[root@mysql user_db]# vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
[root@mysql user_db]# service mysql restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!
[root@mysql user_db]# mysql -uroot -p123456 user_db
……
//DEFAULT所在的位置已经发生改变
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | DEFAULT | MyISAM storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
//数据库的锁,是为了进行并发操作时,操作冲突的情况。
//锁有读锁和写锁。
网友评论