GVKun编程网logo

数据库 MySQL 之 表操作、存储引擎(mysql数据库的存储引擎有哪些)

6

最近很多小伙伴都在问数据库MySQL之表操作、存储引擎和mysql数据库的存储引擎有哪些这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展02.MySQL.存储引擎-事务-隔离级别-

最近很多小伙伴都在问数据库 MySQL 之 表操作、存储引擎mysql数据库的存储引擎有哪些这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展02.MySQL.存储引擎-事务-隔离级别-锁、1.mysql 架构介绍命令,配置文件,架构,存储引擎,、8.3 - mysql 表操作、Database学习 - mysql 数据库 表操作等相关知识,下面开始了哦!

本文目录一览:

数据库 MySQL 之 表操作、存储引擎(mysql数据库的存储引擎有哪些)

数据库 MySQL 之 表操作、存储引擎(mysql数据库的存储引擎有哪些)

浏览目录

  • 创建(复制)

  • 删除

  • 修改

  • 查询

  • 存储引擎介绍

一、创建(复制)

1、语法:

CREATE TABLE 表名(
    字段名1 类型[(宽度) 约束条件],
    字段名2 类型[(宽度) 约束条件],
    字段名3 类型[(宽度) 约束条件]
)ENGINE=innodb DEFAULT CHARSET utf8;

2、创建示例

create table student(
    id int not null auto_increment primary key,
    name varchar(50) not null,
    age int not null,
    sex enum(''男'',''女'') not null default ''男'',
    salary double(10,2) not null
)engine=innodb default charset=utf8;

not null :表示此列不能为空
auto_increment :表示自增长,默认每次增长+1
注意:自增长只能添加在主键或者唯一索引字段上

primary key :表示主键(唯一且不为空)
engine =innodb :表示指定当前表的存储引擎
default charset utf8 :设置表的默认编码集

3、主键

一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。

  • 单一列:
create table tb1(
    nid int not null auto_increment primary key,
    num int null
)
  • 多列组合主键:
create table tb1(
    nid int not null,
    num int not null,
    primary key(nid,num)
)

4、自增

自增,如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)

create table tb1(
    nid int not null auto_increment primary key,
    num int null
)
或
create table tb1(
    nid int not null auto_increment,
    num int null,
    index(nid)
)
注意:
     1、对于自增列,必须是索引(含主键)
     2、对于自增可以设置步长和起始值
    show session variables like ''auto_inc%'';
    set session auto_increment_increment=2;
    set session auto_increment_offset=10;

    show global variables like ''auto_inc%'';
    set global auto_increment_increment=2;
    set global auto_increment_offset=10;

5、复制表  

  • 只复制表结构和表中数据   
create table tb2 select * from tb1; 
ps:主键自增、索引、触发器、外键,不会被复制
  • 只复制表结构 
create table tb2 like tb1; 
ps: 数据、触发器、外键,不会被复制

二、删除

  • 删除表(drop后的表自增字段不清空,继续计数)  
drop table 表名;
  • 清空表(truncate后的表自增字段清空,重新开始计数) 
truncate table 表名;

三、修改

1、添加表字段  

alter table 表名 add 字段名 类型 约束;

例如:

alter table student add age int not null default 0 after name;

ps: after name 表示在name字段后添加字段 age.

2、修改表字段 

方式一: 
alter table student modify 字段 varchar(100) null; 
方式二: 
alter table student change 旧字段 新字段 int not null default 0;

ps:二者区别: 
change 可以改变字段名字和属性 
modify只能改变字段的属性  

3、删除表字段  

alter table student drop 字段名;

4、更新表名称

rename table 旧表名 to 新表名;

5、添加主键  

alter table student add primary key(字段,"多个","间隔");

6、移除主键

alter table student drop primary key;

ps:如果主键为自增长,以上方式则不被允许执行,请先去掉主键自增长属性,然后再移除主键 

alter table student modify id int not null,drop primary key

7、添加外键  

alter table 从表 add CONSTRAINT fk_test foreign key 从表(字段) REFERENCES 主表(字段);

8、移除外键  

alter table 表 drop foreign key 外键名称;

ps:如果外键设置后想修改,那么只能是先删除,再添加

9、修改默认值 

alter table 表 alter 字段 set default 100;

10、删除默认值  

alter table 表 alter 字段 drop default;

四、查询 

1、查询表数据 

select 字段(多个以","间隔) from 表名;

例如:  

select name,sex from student;

或者:

select * from student;

2、查看表结构 

desc 表名;

 例:

desc student;

3、查看创建表信息   

show create table student;

五、存储引擎介绍 

介绍 

存储引擎 : 其实就是指定  如何存储数据,如何为存储的数据 建立索引 以及 如何更新查询数据等技术实现的方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)

了解: 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎

下表显示了各种存储引擎的特性:

特性 MyISAM InnoDB Memory Archive NDB
存储限制 没有 64TB m没有 没有
事务   支持     支持
锁粒度 b表
B树索引 支持 支持 支持   支持
哈希索引   支持 z支持    
全文索引 支持        
集群索引   支持      
数据缓存   支持 支持    
索引缓存 支持 支持 支持    
数据压缩 支持     支持  
批量插入 相对低 非常高
内存消耗 d低
外键支持   支持      
复制支持 支持 支持 支持 支持 支持
查询缓存 支持 支持 支持 支持 支持
备份恢复 支持 支持 支持 支持 支持
集群支持         支持

其中最常见的两种存储引擎是MyISAM 和 InnoDB

MyISAM存储引擎

1、MyISAM 是MySQL (mysql 5.5版本以前) 原来的默认存储引擎.

2、MyISAM   这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁。

3、MyISAM   类型的表支持三种不同的存储结构:静态型、动态型、压缩型。

  (1)静态型:就是定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类型),这样mysql就会自动使用静态myisam格式。

          使用静态格式的表的性能比较高,因为在维护和访问的时候以预定格式存储数据时需要的开销很低。但是这高性能是用空间换来的,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。

  (2)动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时myisam就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低.

  (3)压缩型:如果在这个数据库中创建的是在整个生命周期内只读的表,则这种情况就是用myisam的压缩型表来减少空间的占用。

    压缩方式参考官方文档: https://dev.mysql.com/doc/refman/5.6/en/myisampack.html

4、MyISAM也是使用B+tree索引但是和Innodb的在具体实现上有些不同。

InnoDB存储引擎

(1)MySQL默认存储引擎(MySQL 5.5 版本后).

(2)innodb 支持事务,回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全。

(3)innodb 支持自增长列(auto_increment),自增长列的值不能为空,(一个表只允许存在一个自增,并且要求自增列必须为索引)

(4)innodb 支持外键(foreign key) ,外键所在的表称为子表,而所依赖的表称为父表。

(5)innodb存储引擎支持行级锁。

(6)innodb存储引擎索引使用的是B+Tree

补充3点:

    1.大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。

    2.大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,但是UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。

    3.两种引擎所使用的索引数据结构是什么?

        答案:都是B+树!

    MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。

    Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

Memory存储引擎

Memory存储引擎(之前称为Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。

Archive存储引擎

正如其名称所示,Archive非常适合存储归档数据,如日志信息。它只支持INSERT和SELECT操作,其设计的主要目的是提供高速的插入和压缩功能。

NDB存储引擎

NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC,但它是Share Nothing(非共享)的架构,因此能提供更高级别的高可用性和可扩展性。NDB的特点是数据全部放在内存中,因此通过主键查找非常快。

关于NDB,有一个问题需要注意,它的连接(join)操作是在MySQL数据库层完成,不是在存储引擎层完成,这意味着,复杂的join操作需要巨大的网络开销,查询速度会很慢。

测试存储引擎

 创建三个表,分别使用innodb,myisam,memory 存储引擎,进行插入数据测试

create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
 
#看一下三个存储引擎创建的 表文件
 t1.frm  t1.ibd 
 t2.MYD  t2.MYI  t2.frm 
 t3.frm
#细心的同学会发现最后的存储引擎只有表结构,无数据
#memory,在重启mysql或者重启机器后,表内数据清空  

重点(面试题)

innodb与MyIASM存储引擎的区别:
  1.innodb 是mysql5.5版本以后的默认存储引擎, 而MyISAM是5.5版本以前的默认存储引擎.
  2.innodb 支持事务,而MyISAM不支持事务
  3.innodb 支持行级锁.而MyIASM 它支持的是并发的表级锁.
  4.innodb 支持外键, 而MyIASM 不支持外键
  5.innodb与MyIASM存储引擎都采用B+TREE存储数据, 但是innodb的索引与数据存储在一个文件中,这种方式我们称之为聚合索引. 
    而MyIASM则会单独创建一个索引文件,也就是说,数据与索引是分离开的
  6.在效率方面MyISAM比innodb高,但是在性能方面innodb要好一点.

02.MySQL.存储引擎-事务-隔离级别-锁

02.MySQL.存储引擎-事务-隔离级别-锁

MySQL.存储引擎-事务-隔离级别-锁

###1.什么是存储引擎?

​ MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能

###2.存储引擎有那些?这些引擎有那些特性?

####2.1.Mylsam

MyIsam 存储引擎独立于操作系统,也就是可以在windows上使用,也可以比较简单的将数据转移到linux操作系统上去。这种存储引擎在创建表的时候,会创建三个文件,一个是.frm文件用于存储表的定义,一个是.MYD文件用于存储表的数据,另一个是.MYI文件,存储的是索引。操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据自然可以优化数据库的查询等操作。

2.1.1.不支持事务,但是并不代表着有事务操作的项目不能用MyIsam存储引擎,可以在service层进行根据自己的业务需求进行相应的控制。

2.1.2.不支持外键。

2.1.3.查询速度很快。如果数据库insert和update的操作比较多的话采用表锁效率低(建议使用innodb

2.1.4.对表进行加锁。

####2.2.Mrg_Mysam

Merge存储引擎,是一组MyIsam的组合,也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作。 比如:我们可能会遇到这样的问题,同一种类的数据会根据数据的时间分为多个表,如果这时候进行查询的话,就会比较麻烦,Merge可以直接将多个表聚合成一个表统一查询,然后再删除Merge表(删除的是定义),原来的数据不会影响。

####2.3.Memory

Memory采用的逻辑介质是内存,响应速度应该是很快的,但是当mysqld守护进程崩溃的时候数据会丢失,另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。 使用Memory存储引擎情况 ####2.4.Blackhole “黑洞”存储引擎,他会丢弃所有的插入的数据,服务器会记录下Blackhole表的日志,所以可以用于复制数据到备份数据库。看其他的一些资料说:可以用来充当dummy master,利用blackHole充当一个“dummy master”来减轻master的负载,对于master来说“dummy master” 还是一个slave的角色,还有充当日志服务器等等。

####2.5.CSV

可以将scv文件作为MySql的表来使用,但是不支持索引。CSV引擎表所有的字段都必须为非空的,创建的表有两个,分别是CSV文件和CSM文件。

####2.6.Performance_Schema

MySQL5.5以后新增了一个存储引擎,就是Performance_Schema,他主要是用来收集数据库服务器的性能参数。MySQL用户不能创建存储该类型的表。 他提供了以下的功能

1.提供进程等待的详细信息,包括锁、互斥变量、文件信息。

2.保存历史的事件汇总信息,为Mysql服务器的性能做出详细的判断。

3.对于新增和删除监控时间点都非常容易,并可以随意的改变Mysql服务器的监控周期

需要在配置文件my.cnf中进行配置才能开启。 ####2.7.Archive archive是归档的意思,仅仅支持插入和查询两种功能,在MySQL5.5以后支持索引功能,他拥有很好的压缩机制,使用zlib压缩库,在记录请求的时候实时的进行压缩,经常被用来作为仓库使用。适合存储大量的独立的作为历史记录的数据。拥有很高的插入速度但是对查询的支持较差。 ####2.8.Federated

Federated存储引擎是访问MySQL服务器的一个代理,尽管该引擎看起来提供了一个很好的跨服务器的灵活性,但是经常带来问题,默认是禁用的。

####2.9.InnoDB

InnoDB是一个事务型的存储引擎,有行级锁定和外键约束,适用于以下的场合:

  1. 更新多的表,适合处理多重并发的更新请求。
  2. 支持事务。
  3. 可以从灾难中恢复(通过bin-log日志等)。
  4. 外键约束。只有他支持外键。
  5. 支持自动增加列属性auto_increment。 #####如何修改数据库默认存储引擎: 方式一:

######修改配置文件my.ini,在linux中为my.conf文件 在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB

方式二: 在建表的时候指定 create table test( )engine=''MyISAM''; 方式三: 建表后更改 ''''''MySql alter table table_name engine = ''InnoDB''; 数据量很大的情况下可能要等一段时间

怎么查看修改成功?

方式一: show table status from database_name; 方式二: show create table table_name; ###3.常用的三种数据引擎的比较

RDBMS(OLTP)关系数据库管理系统(Relational Database Management System)

4.1.ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。 MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。 InnoDB: InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。 MEMORY:MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。 在实际工作中,选择一个合适的存储引擎是一个比较复杂的问题。每种存储引擎都有自己的优缺点,不能笼统地说谁比谁好。 InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。 MyISAM: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。 MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

4.事务

4.1.MySQL事务主要用于处理操作量大,复杂度高的数据

1).在MySQL中只有使用了Innodb数据库引擎的数据库和表才支持事务。 2)事物处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。 3)事务用来管理insert,update,delete语句。

4.2.事务(ACID)

1)原子性(Atomicity不可分割性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 2)一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 3)隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 4)持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

4.4.事务控制语句:

BEGIN或START TRANSACTION:显示地开启一个事务: COMMIT:也可以使用COMMIT WORK,不过二者是等价的。COMMIT提交事务,并使已对数据库进行的所有修改成为永久性的; ROLLBACK:有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改: SAVEPOINT identifier:SAVE[POMT 允许在事务中创建一个保存点。一个事务中可以有多个SAVE[POMT; RELEASE SAVEPOIN identifier: 删除一个事务的保存点,一个事务中可以有多个SAVEPOINT; ROLLEASE SAVEPOINT identifier:把事务回滚到标记点; SET TRANSACTION :用来设置事务的隔离基本。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ和SERIALIZABLE.

4.3.MySQL事务处理主要有两种方法:

4.3.1.用BEGIN,ROLLBACK,COMMIT来实现

BEGIN开始一个事务 ROLLBACK事务回滚 COMMIT事务确认

4.3.2.直接用SET 来改变MySQL的自动提交模式;

SET AUTOCOMMIT=0 禁止自动提交 SET AUTOCOMMIT=1 开启自动提交

事务测试
> mysql> use RUNOOB;
> Database changed
> mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;  # 创建数据表
> Query OK, 0 rows affected (0.04 sec)
>
> mysql> select * from runoob_transaction_test;
> Empty set (0.01 sec)
>
> mysql> begin;  # 开始事务
> Query OK, 0 rows affected (0.00 sec)
>
> mysql> insert into runoob_transaction_test value(5);
> Query OK, 1 rows affected (0.01 sec)
>
> mysql> insert into runoob_transaction_test value(6);
> Query OK, 1 rows affected (0.00 sec)
>
> mysql> commit; # 提交事务
> Query OK, 0 rows affected (0.01 sec)
>
> mysql>  select * from runoob_transaction_test;
> +------+
> | id   |
> +------+
> | 5    |
> | 6    |
> +------+
> 2 rows in set (0.01 sec)
>
> mysql> begin;    # 开始事务
> Query OK, 0 rows affected (0.00 sec)
>
> mysql>  insert into runoob_transaction_test values(7);
> Query OK, 1 rows affected (0.00 sec)
>
> mysql> rollback;   # 回滚
> Query OK, 0 rows affected (0.00 sec)
>
> mysql>   select * from runoob_transaction_test;   # 因为回滚所以数据没有插入
> +------+
> | id   |
> +------+
> | 5    |
> | 6    |
> +------+
> 2 rows in set (0.01 sec)
>
> mysql>

5.RDBMS关系数据库管理(Relational Database Managemet System)

5.1.事务的隔离级别

1)Read Uncommitted(读取未提交内容)

2) Read Committed(读取提交内容)

3)Repeatable Read(可重读)

4) Serializable(可串行化)

Scala有8种数据类型:Byte,Char,Short,Int,Long,Float,Double以及Boolean

隔离级别 脏读 不可重复读 幻读
读未提交(Read uncommitted) true true true
读已提交(Read committed) false true true
可重复读(Repeatable read) false false true
可串行化(Serializable) false false false
5.2.事务并发执行的现象

1)第一类丢是更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。

例如:

张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5000,汇入100,并提交数据库,工资变5100,
随后事务A发生异常,回滚了,恢复张三的工资为5000,这样就导致事务B的更新丢失了。

2)脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种还没有提交到数据库种,这是,另外一个事务也访问这个数据,然后使用了这个数据。

  张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
  与此同时,
  事务B正在读取张三的工资,读取到张三的工资为8000。
  随后,
  事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
  最后,
  事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。

3)不可重复读:是指在一个事务内,多次读同一个数据。在这个事务还没有结束时,另外一个事务也访问该同一个数据。那么,在第一个事务种的两此读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

例如:
  在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
  与此同时,
  事务B把张三的工资改为8000,并提交了事务。
  随后,
  在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。

4)第二类丢失更新:不可重复读的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一此写操作失效。

例如:
在事务A中,读取到张三的存款为5000,操作没有完成,事务还没提交。
  与此同时,
  事务B,存储1000,把张三的存款改为6000,并提交了事务。
  随后,
  在事务A中,存储500,把张三的存款改为5500,并提交了事务,这样事务A的更新覆盖了事务B的更新。

5)幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

例如:
  目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
  此时,
  事务B插入一条工资也为5000的记录。
  这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
提醒:

不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现值不一样了 幻读的种的在于新曾或者删除,同样的条件,第1次和第2次读出来的记录数不一样

6 .0.锁

MySQL各种存储引擎使用了三种类型(级别)的锁定制机制: #####1.表级锁定(table-level):表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。

注意:当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。

#####2.行级锁定(row-level):行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。

虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。使用行级锁定的主要是InnoDB存储引擎。

3.页级锁定(page-level):页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。

在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。 使用页级锁定的主要是BerkeleyDB存储引擎。

共享锁(S) 排他锁(X) 意向共享锁(IS) 意向排他锁(IX)
共享锁(S) 兼容 冲突 兼容 冲突
排他锁(X) 冲突 冲突 冲突 冲突
意向共享锁(IS) 兼容 冲突 兼容 兼容
意向排他锁(IX) 冲突 冲突 兼容 兼容

总结: 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低; 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高; 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。 在数据库引擎InnoDB中支持行锁和表锁用的也比较多,但是Myisam不支持事务,只支持表锁 [隔离级别] 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须取得该表的IX锁 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取的该表的IS锁

1.mysql 架构介绍命令,配置文件,架构,存储引擎,

1.mysql 架构介绍命令,配置文件,架构,存储引擎,

1.查看是否安装sql
    查询命令:rpm -qa|grep -i mysql
    删除命令:rpm -e RPM 软件包名(该名字是一上一个命令查出来的名字)
            rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64
2.查看mysql是否安装成功
    ps -ef|grep mysql
3.查看mysql安装时创建的mysql用户和用户组
    cat /etc/passwd|grep mysql
    cat /etc/group|grep 
    也可以执行:mysqladmin --version
4.给mysql设置登录密码
    /usr/bin/mysqladmin -u root password hadoop
5.自启动mysql服务
    chkconfig mysql on 设置开机自启动
    chkconfig --list|grep mysql
    ntsysv
6.在linux下查看安装目录 
    ps -ef|grep mysql
7.修改配置文件位置
    当前5.5版本:cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
    当前5.6版本:cp /usr/share/mysql/my-default.cnf /etc/my.cnf
    重新启动服务:service mysql start
8.修改字符集和数据存储路径
    show variables like ''character%'';
    show variables like ''%char%'';
    注:默认的是客户端和服务器端都用了latin1 ,所以会乱码

2.mysql 的主要配置文件

一、二进制日志log-bin
  作用:主从复制
二、错误日志 log-err
  默认关闭,记录严重的警告和错误信息,每次启动和关闭的详细信息
三、慢查询日志log
  默认关闭,记录查询的sql语句,如果开启会降低sql的整体性能,因为记录日志也是需要消耗系统资源。
四、数据文件
  frm文件:存放表结构
  myd:存放表数据
  myi:存放表索引
  两个系统:
    windows: D:MySQLServer5.5\data 目录下可以挑选很多库
    linux: 查看当前系统中的全部库后再进去
        默认路径:/var/lib/mysql 五、linux配置路径:
/etc/my.cnf
  widows配置路径: my.ini

3.mysql 的架构

 

和其他数据库相比,MySQL 有点与众不同,他的架构可以在很多种不同场景中应用并发挥良好的作用

主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储

提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎

 

看你的mysql现在已经提供什么存储引擎
  show variables like ''%storage_engine%'';
  show engines;
  注:默认和当前都使用的    InnoDB
MyISAM和InnoDB的区别

 

 阿里巴巴 淘宝用那个

 

8.3 - mysql 表操作

8.3 - mysql 表操作

 

什么是存储引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

存储引擎就是表的类型

 

现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等

数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎

mysql支持的存储引擎

mysql> show engines\G;
*************************** 1. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
9 rows in set (0.00 sec)

ERROR: 
No query specified
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1            |
+---------------+
1 row in set (0.00 sec)

# 创建指定引擎的表
mysql> create table t2(id int) engine=innodb;
Query OK, 0 rows affected (0.03 sec)

# 查看创建的过程
mysql> show create table t2\G;
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR: 
No query specified

# 其他类型的引擎方式
mysql> create table t3(id int) engine=memory;  # 存在内存中,只有表结构,没有数据
Query OK, 0 rows affected (0.00 sec)

mysql> create table t4(id int) engine=blackhole; # 存入的数据就没啦
Query OK, 0 rows affected (0.00 sec)

mysql> create table t5(id int) engine=myisam;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t3 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t4 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t5 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t3;  # 存于内存,重启mysql就啦
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from t4;  # 数据没有啦,黑洞
Empty set (0.00 sec)

mysql> select * from t5;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

# 重启mysql 查看t3的数据
Usage: /etc/init.d/mysql start|stop|restart|reload|force-reload|status
leco@leco:/etc/mysql/mysql.conf.d$ /etc/init.d/mysql restart
[ ok ] Restarting mysql (via systemctl): mysql.service.
leco@leco:/etc/mysql/mysql.conf.d$ mysql -uroot -pleco
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.21-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ''help;'' or ''\h'' for help. Type ''\c'' to clear the current input statement.

mysql> use db1;
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_db1 |
+---------------+
| t1            |
| t2            |
| t3            |
| t4            |
| t5            |
+---------------+
5 rows in set (0.00 sec)

mysql> desc t3;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> select * from t3;  # 发现数据么有啦
Empty set (0.00 sec)

mysql 表的增删改查

id,name,age,sex 是表字段,其他均是数据

创建表

语法

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

#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
4. []数据中是可有可无的
5. 每行有逗号,除了最后一条数据

详细操作步骤

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> create database db2 charset utf8;
Query OK, 1 row affected (0.00 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.03 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> insert into t1 values(1,''cmz'',''male'',18);  # 单条数据插入
Query OK, 1 row affected (0.01 sec)

mysql> insert into t1 values(2,''leco'',''female'',10),(3,''loocha'',''male'',8);  # 多条数据插入
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+--------+--------+------+
| id   | name   | sex    | age  |
+------+--------+--------+------+
|    1 | cmz    | male   |   18 |
|    2 | leco   | female |   10 |
|    3 | loocha | male   |    8 |
+------+--------+--------+------+
3 rows in set (0.00 sec)

 

修改表结构

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

2. 增加字段
      ALTER TABLE 表名
                          ADD 字段名  数据类型 [完整性约束条件…],
                          ADD 字段名  数据类型 [完整性约束条件…];
      ALTER TABLE 表名
                          ADD 字段名  数据类型 [完整性约束条件…]  FIRST;  # 字段放在开头
      ALTER TABLE 表名
                          ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名; # 字段放在 after字段,该字段后

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

4. 修改字段
      ALTER TABLE 表名 
                          MODIFY  字段名 数据类型 [完整性约束条件…];
      ALTER TABLE 表名 
                          CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
      ALTER TABLE 表名 
                          CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

示例

示例:
1. 修改存储引擎
mysql> alter table service 
    -> engine=innodb;

2. 添加字段
mysql> alter table student10
    -> add name varchar(20) not null,
    -> add age int(3) not null default 22;

mysql> alter table student10
    -> add stu_num varchar(10) not null after name;                //添加name字段之后

mysql> alter table student10                        
    -> add sex enum(''male'',''female'') default ''male'' first;          //添加到最前面

3. 删除字段
mysql> alter table student10
    -> drop sex;

mysql> alter table service
    -> drop mac;

4. 修改字段类型modify
mysql> alter table student10
    -> modify age int(3);
mysql> alter table student10
    -> modify id int(11) not null primary key auto_increment;    //修改为主键

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

6. 对已经存在的表增加复合主键
mysql> alter table service2
    -> add primary key(host_ip,port);        

7. 增加主键
mysql> alter table student1
    -> modify name varchar(10) not null primary key;

8. 增加主键和自动增长
mysql> alter table student1
    -> modify id int not null primary key auto_increment;

9. 删除主键
a. 删除自增约束
mysql> alter table student10 modify id int(11) not null; 

b. 删除主键
mysql> alter table student10                                 
    -> drop primary key;
五、复制表
sql

具体演示操作

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.00 sec)

mysql> select * from t1;
+------+--------+--------+------+
| id   | name   | sex    | age  |
+------+--------+--------+------+
|    1 | cmz    | male   |   18 |
|    2 | leco   | female |   10 |
|    3 | loocha | male   |    8 |
+------+--------+--------+------+
3 rows in set (0.00 sec)

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

mysql> show create table t1\G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `sex` enum(''male'',''female'') DEFAULT NULL,
  `age` int(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR: 
No query specified

#2. 添加字段
mysql> create table student(id int);
Query OK, 0 rows affected (0.02 sec)

mysql> desc student;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table student add name varchar(20) not null,  # 默认不能为空
    -> add age int(10) not null default 22;                # 默认不能为空,默认值是22
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

# 添加到最开始
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
mysql> alter table student add sex enum(''male'',''female'') default ''male'' first;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| sex   | enum(''male'',''female'') | YES  |     | male    |       |
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(20)           | NO   |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 插入××之后
mysql> desc student;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| sex   | enum(''male'',''female'') | YES  |     | male    |       |
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(20)           | NO   |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> alter table student add stu_num varchar(10) not null after id;  #插入在id之后
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+---------+-----------------------+------+-----+---------+-------+
| Field   | Type                  | Null | Key | Default | Extra |
+---------+-----------------------+------+-----+---------+-------+
| sex     | enum(''male'',''female'') | YES  |     | male    |       |
| id      | int(11)               | YES  |     | NULL    |       |
| stu_num | varchar(10)           | NO   |     | NULL    |       |
| name    | varchar(20)           | NO   |     | NULL    |       |
+---------+-----------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)


#3. 删除字段
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
| age   | int(10)     | NO   |     | 22      |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> alter table student drop age;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

#4. 修改字段类型modify
mysql> desc student;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| sex   | enum(''male'',''female'') | YES  |     | male    |       |
| id    | int(11)               | YES  |     | NULL    |       |
| age   | int(3)                | NO   |     | 22      |       |
| name  | varchar(20)           | NO   |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> alter table student modify name varchar(10) not null; 
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

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

mysql> desc student;  +-------+-----------------------+------+-----+---------+----------------+
| Field | Type                  | Null | Key | Default | Extra          |
+-------+-----------------------+------+-----+---------+----------------+
| sex   | enum(''male'',''female'') | YES  |     | male    |                |
| id    | int(11)               | NO   | PRI | NULL    | auto_increment |
| age   | int(3)                | NO   |     | 22      |                |
| name  | varchar(10)           | NO   |     | NULL    |                |
+-------+-----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

#5. 增加约束(针对已有的主键增加auto_increment)
mysql> alter table student  modify id int(11) not null primary key auto_increment;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;  
+-------+-----------------------+------+-----+---------+----------------+
| Field | Type                  | Null | Key | Default | Extra          |
+-------+-----------------------+------+-----+---------+----------------+
| sex   | enum(''male'',''female'') | YES  |     | male    |                |
| id    | int(11)               | NO   | PRI | NULL    | auto_increment |
| age   | int(3)                | NO   |     | 22      |                |
| name  | varchar(10)           | NO   |     | NULL    |                |
+-------+-----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)


mysql> alter table student modify id int(11) not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined
mysql> alter table student modify id int(11) not null auto_increment;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+-------+-----------------------+------+-----+---------+----------------+
| Field | Type                  | Null | Key | Default | Extra          |
+-------+-----------------------+------+-----+---------+----------------+
| sex   | enum(''male'',''female'') | YES  |     | male    |                |
| id    | int(11)               | NO   | PRI | NULL    | auto_increment |
| age   | int(3)                | NO   |     | 22      |                |
| name  | varchar(10)           | NO   |     | NULL    |                |
+-------+-----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

#6. 对于存在的表增加复合主键
mysql> desc student;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| sex   | enum(''male'',''female'') | YES  |     | male    |       |
| id    | int(11)               | NO   |     | NULL    |       |
| age   | int(3)                | NO   |     | 22      |       |
| name  | varchar(10)           | NO   |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> alter table student add primary key(id,age);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| sex   | enum(''male'',''female'') | YES  |     | male    |       |
| id    | int(11)               | NO   | PRI | NULL    |       |
| age   | int(3)                | NO   | PRI | 22      |       |
| name  | varchar(10)           | NO   |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

#7. 增加主键
mysql> alter table student  modify id int(11) not null primary key;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

#8. 增加主键,自动增长
mysql> alter table student  modify id int(11) not null primary key auto_increment;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

#9. 删除主键
 # 1. 先删除子增约束
 # 2. 删除主键
mysql> desc student;
+-------+-----------------------+------+-----+---------+----------------+
| Field | Type                  | Null | Key | Default | Extra          |
+-------+-----------------------+------+-----+---------+----------------+
| sex   | enum(''male'',''female'') | YES  |     | male    |                |
| id    | int(11)               | NO   | PRI | NULL    | auto_increment |
| age   | int(3)                | NO   |     | 22      |                |
| name  | varchar(10)           | NO   |     | NULL    |                |
+-------+-----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

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

mysql> alter table student drop primary key;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

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


 

 

复制表

1. 复制表结构 + 记录(数据)
2. 只复制表结构,不复制记录
1. 复制部分表结构
2. 复制全部表结构

复制表结构+记录 (key不会复制: 主键、外键和索引) # 复制表结构哦和数据 root@leco:
~# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 5.7.21-0ubuntu0.16.04.1 (Ubuntu) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type ''help;'' or ''\h'' for help. Type ''\c'' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) 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> 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.00 sec) mysql> select × from t1; ERROR 1054 (42S22): Unknown column ''×'' in ''field list'' mysql> select * from t1; +------+--------+--------+------+ | id | name | sex | age | +------+--------+--------+------+ | 1 | cmz | male | 18 | | 2 | leco | female | 10 | | 3 | loocha | male | 8 | +------+--------+--------+------+ 3 rows in set (0.00 sec) mysql> create table new_t1 select * from t1; Query OK, 3 rows affected (0.03 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> show tables; +---------------+ | Tables_in_db2 | +---------------+ | new_t1 | | t1 | +---------------+ 2 rows in set (0.00 sec) mysql> desc new_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 * from new_t1; +------+--------+--------+------+ | id | name | sex | age | +------+--------+--------+------+ | 1 | cmz | male | 18 | | 2 | leco | female | 10 | | 3 | loocha | male | 8 | +------+--------+--------+------+ 3 rows in set (0.00 sec) # 只复制表结构,不复制数据 mysql> create table t2 select * from t1 where 1=2; # 条件为假,查不到任何记录,此时就只会复制表结构,不复制表数据 Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show tables; +---------------+ | Tables_in_db2 | +---------------+ | new_t1 | | t1 | | t2 | +---------------+ 3 rows in set (0.00 sec) mysql> desc t2; +-------+-----------------------+------+-----+---------+-------+ | 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> select * from t2; Empty set (0.00 sec) mysql> create table t3 like t1; Query OK, 0 rows affected (0.03 sec) mysql> show tables; +---------------+ | Tables_in_db2 | +---------------+ | new_t1 | | t1 | | t2 | | t3 | +---------------+ 4 rows in set (0.00 sec) mysql> desc t3; +-------+-----------------------+------+-----+---------+-------+ | 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> select * from t3; Empty set (0.00 sec)

注意:

create table t2 select * from t1 where 1=2; 和 create table t3 like t1;都是创建表结构有神码区别?
前者可以选择性的复制,比如只复制其中部分字段的表结构,而后者是全部复制表结构字段。

 

删除表

DROP TABLE 表名;
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| new_t1        |
| t1            |
| t2            |
| t3            |
+---------------+
4 rows in set (0.00 sec)

mysql> drop table t3;  # 指定表名
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| new_t1        |
| t1            |
| t2            |
+---------------+
3 rows in set (0.01 sec)

 

 

Database学习 - mysql 数据库 表操作

Database学习 - mysql 数据库 表操作

mysql 数据库 表操作

 

创建数据表

  基本语法格式:

    创建数据表:
    create table 表名(
    字段名  datatype  约束,
    字段名  datatype  约束,
    ......
    )

 

修改表名

rename table 表名 新表名;

 

修改表结构

  增加一个字段

alter table 表名 add 字段名 数据类型;

 

  删除一个字段

alter table 表名 drop 字段名;

 

  修改一个字段属性

alter table 表名  modify 字段 数据类型 属性[after/first 字段名] ;

 

   修改一个列列名

alter table 表名  change 旧字段名 新字段名  数据类型属性 [after/first 字段名];

 

删除表

drop table 表名;

 

查看所有表

show tables ;

 

查看表结构

desc 表名;

show columns from 表名;

 

查看创建表信息

show create table  表名;

 

我们今天的关于数据库 MySQL 之 表操作、存储引擎mysql数据库的存储引擎有哪些的分享已经告一段落,感谢您的关注,如果您想了解更多关于02.MySQL.存储引擎-事务-隔离级别-锁、1.mysql 架构介绍命令,配置文件,架构,存储引擎,、8.3 - mysql 表操作、Database学习 - mysql 数据库 表操作的相关信息,请在本站查询。

本文标签: