转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> 其他 >> 正文
InnoDB中文参考手册---4建立InnoDB表         ★★★★

InnoDB中文参考手册---4建立InnoDB表

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1622 更新时间:2009/4/22 23:21:55

4 建立 InnoDB 表

假设你已以 mysql test 命令方式运行了 MySQL 客户端程序。为了建立一个 InnoDB 格式的表你必须在 SQL 命令中指定 TYPE = InnoDB

CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB;
 

这个 SQL 命令将在 my.cnf 中设定的 InnoDB 数据文件中创建一个表和一个列 A 的索引,同时将在 MySQL 数据目录下的 test 中建立一个名为 CUSTOMER.frm 的文件。在内部,InnoDB 将在它自己的数据字典(data dictionary)中添加表“test/CUSTOMER”的进入点。这样你可以在其它的 MySQL 数据库中建立一个同样名为 CUSTOMER 的数据表,它将不会与 InnoDB 中的表冲突。

可以通过发出 MySQL 的查看表状态命令查看任何一个 InnoDB 类型表以查看 InnoDB 数据文件的剩余空间。SHOW 输出信息中的表注释部分将显示数据文件的剩余空间。示例:

SHOW TABLE STATUS FROM test LIKE 'CUSTOMER'
 

注意:SHOW 给出的 InnoDB 表统计只是近似的:他们被 SQL 优化。然而,表和索引的 reserved sizes in bytes 是精确的。

要特别注意不要在 InnoDB 数据库中手动添加与删除“.frm” 文件:使用 CREATE TABLE DROP TABLE 命令。 InnoDB 有它自己的内部数据字典(data dictionary),如果 MySQL的“.frm” 文件与  InnoDB 内部的数据字典不“同步”将产生一个错误。

4.1 如何通过不同的 APIs 在 InnoDB 中使用事务

默认的,MySQL 总是启动自动提交你运行的每个 SQL 语句的自动提交(autocommit)模式创建每的新连接。为了使用事务,可以使用 SQL 命令 SET AUTOCOMMIT = 0 关闭自动提交(autocommit)开关,使用 COMMIT ROLLBACK 来提交事务和回滚事务。如果你想保留 autocommit 开关打开,你可以将事务放入 BEGIN COMMIT ROLLBACK之间。

heikki@hundin:~/mysql/client> mysql test
 Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 5 to server version: 3.23.50-log
 
 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
 mysql> CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB;
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> BEGIN;
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> INSERT INTO CUSTOMER VALUES (10, 'Heikki');
 Query OK, 1 row affected (0.00 sec)
 
 mysql> COMMIT;
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> SET AUTOCOMMIT=0;
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> INSERT INTO CUSTOMER VALUES (15, 'John');
 Query OK, 1 row affected (0.00 sec)
 
 mysql> ROLLBACK;
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> SELECT * FROM CUSTOMER;
 +------+--------+
 | A      | B        |
 +------+--------+
 | 10     | Heikki |
 +------+--------+
 1 row in set (0.00 sec)
 
 mysql>
 

 

通过 APIs (比如 PHP, Perl DBI/DBD, JDBC, ODBC, 或 MySQL 的标准 C 调用接口),发送一个事务控制语句(比如 "COMMIT" )到 MySQL 服务器可以如同其它的 SQL 语句。例如:"SELECT...""INSERT..."。 APIs often contain separate special commit-transaction methods, 但是 MySQL 对事务的支持还相对比较年轻,他们并不是在所有版本的 APIs 上均能工作的。

4.2 将 MyISAM 表转换到 InnoDB 类型

重要提醒:不可以将 MySQL 系统表比如 'user' 'host' 转换成 InnoDB 类型。系统表必须为 MyISAM 类型。

 

如果你希望所有你新建的表是 InnoDB 类型,从 MySQL version 3.23.43 开始,你可以在你的 my.cnf 或my.ini 文件的 [mysqld] 项下加入下列一行

default-table-type=innodb

 

InnoDB 没有一个特殊的分册索引建立优化机制。因此不支持先 export/import 表然后创建索引。最快的办法就是直接将表类型改变为 InnoDB 类型或直接插入数据,这就是说,使用 ALTER TABLE ... TYPE=INNODB 或新建一个空的具有相同结构的 InnoDB 表,然后使用 INSERT INTO ... SELECT * FROM .... 插入数据。

如果有 UNIQUE 约束,从 3.23.52 开始为了提高插入速度你可以关闭唯一性检查:

SET UNIQUE_CHECKS=0;
 
对于较大的表,在向 InnoDB 中插入时会使用索引缓冲区来合并辅助索引记录来分批插入,这将减少许多磁盘的 I/O。

 

为了更好地控制插入过程,最好将大的表分批插入:

INSERT INTO newtable SELECT * FROM oldtable WHERE yourkey > something
   AND yourkey <= somethingelse;
 

等全部数据插入完毕后,可以重新命名表名。

在插入过程中,要将 InnoDB 的缓冲池(buffer pool)设大一点以减少磁盘 I/O,然而不要超过物理内存的 80 %。同时还应该将日志文件和日志缓冲加大。

需要注意的是不要让表空间用尽: InnoDB 表比 MyISAM 表使用更多的内存。如果 ALTER TABLE 用光了表空间,将会回滚,如果磁盘不够的话,这个过程将持续几个小时。在向 InnoDB 中插入时会使用索引缓冲区来合并辅助索引记录来分批插入,这将减少很多磁盘 I/O。而在回滚中并不使用这种机制,这将比前者多使用 30 倍的时间。

为了退出失控的回滚,如果在你的导入表中没有什么重要的数据,从 3.23.53 和 4.0.3 开始可以使用技巧退出回滚,请查看 6.1 退出失控的回滚(stop the runaway rollback)。

4.3 外键约束

从 3.23.43b 开始 InnoDB 支持外键约束特性。InnoDB 表类型第一次为 MySQL 提供了外键约束以保证你的数据完整性。

InnoDB 中外键约束的定义语法如下所示:


[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
                 REFERENCES table_name (index_col_name, ...)
                 [ON DELETE {CASCADE | SET NULL | NO ACTION
                                       | RESTRICT}]
                 [ON UPDATE {CASCADE | SET NULL | NO ACTION
                                       | RESTRICT}]                      
 
两个表必须为 InnoDB 类型,外键和被引用键(referenced key)必须是索引中的第一(FIRST)列。InnoDB 不会自动为外键和被引用键建立索引,必须明确创建它们。

 

外键与对应的被引用键在 InnoDB 内必须 有相似的内部数据类型,以便他们不需要一个类型转换就可以进行比较。 整型(Integer)字段的长度与有符号类型(signedness)必须一致。 字符型则不需要一致。如果指定了一个 SET NULL 动作,那你必须要确定 子表中的对应字段没有定义为 NOT NULL

如果 CREATE TABLE 给出 1005 号错误,错误信息字符串提示错误号(errno) 150,那么就是因为外键约束未被正确建立而导致表创建失败。同样的,如果一条 ALTER TABLE 失败而返回错误号 150,那就意味着 altered table 未能正确定义一个外键。从 4.0.13 开始,你可以通过使用 SHOW INNODB STATUS 来查看服务器是最后一条 InnoDB 的外键错误的详细说明。

从 3.23.50 开始,InnoDB 不再在允许 NULL 值外键或被引用键上检查外键约束。

与 SQL 标准不一致: if in the parent table there are several rows which have the same referenced key value, then InnoDB acts in foreign key checks like the other parent rows with the same key value would not exist. For example, if you have defined a RESTRICT type constraint, and there is a child row with several parent rows, InnoDB does not allow the deletion of any of those parent rows.

从 3.23.50 开始,可能联合 ON DELETE CASCADE ON DELETE SET NULL 子句与外键约束一同作用。相应的 ON UPDATE 选项将从 4.0.8 开始支持。如果 ON DELETE CASCADE 被指定,当主表中的记录行被删除时,InnoDB 将自动删除子表中被引用键值与主表中相对应的外键值相同的记录。如果 ON DELETE SET NULL 被指定,子表中的外键对应行将被设置为 NULL 值。

与 SQL 标准不一致: if ON UPDATE CASCADE or ON UPDATE SET NULL recurses to update the SAME TABLE it has already updated during the cascade, it acts like RESTRICT. This is to prevent infinite loops resulting from cascaded updates. A self-referential ON DELETE SET NULL, on the other hand, works starting from 4.0.13. A self-referential ON DELETE CASCADE has always worked.

示例:


CREATE TABLE parent(id INT NOT NULL,
                    PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE child(id INT, parent_id INT,
                   INDEX par_ind (parent_id),
                   FOREIGN KEY (parent_id) REFERENCES parent(id)
                   ON DELETE CASCADE
) TYPE=INNODB;
 

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台