InnoDB存储引擎学习总结-第四章 表

2019-02-18  本文已影响0人  油多坏不了菜

常用命令

insert into z select null,1,2,3;
set  autocommit=0;
DELIMITER//
DELIMETER;
create PROCEDURE procedure_name();//创建存储过程。
call procedure_name();//调用存储过程
delete from #tb_name#;//删除表的数据
drop #tb_name#;//删除表,包括定义和数据。

一、索引组织表

在InnoDB存储引擎中,表都是根据主键顺序组织存放的。如果未定义主键,或选取第一个定义的非空唯一索引或者自动创建隐含索引列。

二、InnoDB逻辑存储结构

三、行记录格式

show table status like 'tb_name'\G;
可以看到表的存储引擎、行记录格式、等

四 约束

Primary key
Unique key
Foreign key
Default
NOT NULL

create table u( id int, 
                 name varchar(120),
                 id_card CHAR(18),
                 primary key(id),
                 unique key(name));

alter table新增唯一约束:
alter table u add unique key id_card_unique(id_card);
外键约束:
alter table u add forign key (id) references u (id);
NOT NULL约束: id_card CHAR(18) NOT NULL

delimiter //
    create trigger #trg_name# before update on #tb_Name#
    for each row
    begin
    if new.usercash - old.usercash > 0 then 
      nsert into usercash_err_log select Null, old.userid,old.cash,new.cash,user(),now();
       set new.cash = old.cash;
    end if;
    end;
    //

五、外键约束

myIsam存储引擎不支持外键
外键的定义

alter table add foreign key #keyName#(colName) references (#tbName#(colName)) 
on update cascade 
on delete set null;

外键定义中当对父表就行delete和update操作时,对子表可以的操作有:

定义外键的列会默认创建索引(避免死锁,why?)
导入数据最好关闭外键检测,避免浪费太多时间
set foreign_key_checks = 0;

六、视图

视图是虚表,可以让程序不关心基表的结构,能起到一个安全层的作用。
创建视图

create view view_name as
select * from tb_name where id < 10;
or
create view view_name as 
select id as v_id, name as v_name from tb_name where id < 10 with check option;

with check option 选项:针对可更新视图,检查值的合法性。

七、分区

7.1 分区概述

7.2 range分区

create table t( 
               id int
              )
          partition by range(id) (  //可以结合函数 partition by range(YEAR(date))
          partition p0 values less than (10),
          partition p1 values less than (20),
          partition p2 values less than maxvalue);

可以用于range分区的函数
year();to_days();to_seconds();unix_timestamp()等函数;
而表达式不行。

7.3list 分区

demo:

create table t( 
               id int
              )
          partition by list(id) ( 
          partition p1 values in (1,3,5,7,9),
          partition p2 values in (2,4,6,8,10));

使用分区时,注意引擎对事务的支持。如在插入数据时,遇到分区未定义的值,MyISAM引擎会将之前的行都插入,而InnoDB会回滚。

7.4 hash分区

partition by hash (expr);//expr为一个返回整数值的表达式
demo

create table t( 
               id int
              )
          partition by hash (id) 
          partitions 4;

对于自增主键,hash分区能将数据较均匀的分布。

7.5 key分区

不同于hash分区使用用户定义的函数分区,key使用mysql体统的函数分区; partition by key (id)

7.6 columns 分区

可以直接使用非整形数据分区(前面四种不行)
支持的数据类型

7.7 子分区

对于特别大的表可以在分区上再进行分区。

7.8 分区中的NULL值

7.9分区和性能

上一篇 下一篇

猜你喜欢

热点阅读