14.8.1 Creating InnoDB Tables 创建InnoDB 表

14.8.1 Creating InnoDB Tables  创建InnoDB 表


创建一个InnoDB表,使用CREATE TABLE 语句,你不需要指定ENGINE=InnoDB 子句 

如果InnoDB 是定义为默认的存储引擎,在MySQL 5.5是默认为InnoDB.


你仍旧可以使用 ENGINE=InnoDB clause 如果你计划使用mysqldump或者复制 来重现CREATE TABLE 在一个server上

那个server 默认不是InnoDB 存储引擎

-- Default storage engine = InnoDB.
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a));

-- Backward-compatible with older MySQL.
CREATE TABLE t2 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;



在一个InnoDB 表和他的索引可以创建在系统表空间或者一个 file-per-table tablespace. 


当 innodb_file_per_table  启用时,一个InnoDB 表时隐式的创建在一个单独的 file-per-table tablespace. 


相反,当innodb_file_per_table is disabled,  一个InnoDB 表时隐式的创建在系统表空间。


当你创建一个InnoDB 表,MySQL 创建一个 .frm file 在一个数据库目录在MySQL data directory.目录下。


一个.ibd文件也会被创建  一个表创建在 system tablespace 是创建在存在的system tablespace ibdata files.


在内部, InnoDB 增加一个条目对于每个表到InnoDB 的数据字典。

条目包含数据库名字 比如,如果表t1是创建在test数据库下,

数据目录条目是'test/t1'.

这意味着你能创建相同的名字的表在不同的数据库,表名字在InnoDB内部不冲突


mysql> SHOW TABLE STATUS FROM test LIKE 't%' \G;
*************************** 1. row ***************************
           Name: t1
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2015-03-16 16:26:52
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)


在这个状态输出,你可以看到 表t1的hang格式属性是 Compact


尽管设置是好的对于基本的实验,使用动态或者压缩行格式来利用InnoDB的功能 

比如表压缩和off-page storage  用于long列的值  使用那些行格式需要innodb_file_per_table 启用

mysql> SHOW TABLE STATUS FROM zjzc like 'Client'\G;
*************************** 1. row ***************************
           Name: Client
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 13244
 Avg_row_length: 436
    Data_length: 5783552
Max_data_length: 0
   Index_length: 3620864
      Data_free: 3145728
 Auto_increment: 13778
    Create_time: 2016-10-28 09:46:59
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 用户表

1 row in set (0.00 sec)

ERROR: 
No query specified


SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=barracuda;
CREATE TABLE t3 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=DYNAMIC;
CREATE TABLE t4 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=COMPRESSED;


Defining a Primary Key for InnoDB Tables  定义一个主键在InnoDB 表上


1.总是设置一个主键对于每个InnoDB表,指定列或者多列


2. 被用于最重要的查询

3.永远不会是空的

4.不会有重复值

5.很少改动一旦插入后


例如, 在一个表包含信息关于people, 你不能创建一个主键在(firstname, lastname)

因为不止一个人有相同的名字, 有些人last name是空白的,有些人会改变它们的名字。

有这么多的约束, 没有一个明显的列来使用作为主键。


因此你可以创建一个数据列ID 来作为主键,你可以定义一个自增列

posted @ 2016-11-11 11:21  czcb  阅读(279)  评论(0编辑  收藏  举报