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

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

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

从 3.23.50 开始,InnoDB 允许通过下面的方法给一个表添加一个外键约束:


ALTER TABLE yourtablename
         ADD [CONSTRAINT symbol] FOREIGN KEY [id] (...)
         REFERENCES table_name (index_col_name, ...)
                     [ON DELETE {CASCADE | SET NULL | NO ACTION
                                            | RESTRICT}]
                     [ON UPDATE {CASCADE | SET NULL | NO ACTION
                                            | RESTRICT}]
 
记住首先要建立必要的索引,尽管可以通过 ALTER TABLE 为一个表建立一个自参考(self-referential)的外键。

从 4.0.13 开始,InnoDB 支持

ALTER TABLE DROP FOREIGN KEY internally_generated_foreign_key_id
当你需要删除一个外键时可以使用 SHOW CREATE TABLE 来查看 internally generated foreign key id。

如果要导入表的几个转储(dump),而数据并没有按外键排序,从 3.23.52 和 4.0.3 开始,可以在导入时关闭外键检查

SET FOREIGN_KEY_CHECKS=0;
 
这就允许以任何顺序导入数据,同时提高导入速度。

 

从 3.23.50 开始,InnoDB 语法分析器(parser)允许你 backquotes around table 以及将列名放入 FOREIGN KEY ... REFERENCES ... 子句中。从 4.0.5 开始,InnoDB 语法分析器能处理 my.cnf 文件可能设置的 lower_case_table_names

在小于 3.23.50 的版本中,InnoDB 任何 ALTER TABLECREATE INDEX 均不能在使用在有外键约束或被引用键约束的表上:任何 ALTER TABLE 都将删除表中定义的外键约束。不能再使用 ALTER TABLE 来任何一个表,只有通过 DROP TABLE CREATE TABLE 来修改。当 MySQL 执行一个 ALTER TABLE 时,在内部处理上是通过 RENAME TABLE 来实现的,这将引起外键约束对表的引用混乱。同样 CREATE INDEX 语句也是作为 ALTER TABLE来处理的,也不能用于外键约束的表。

当 InnoDB 进行外键检查时会对主表与子表数据加行锁。nnoDB 会立即检查外键约束:检查不会等到事务提交。

InnoDB 允许你 drop 任何表,即使这样会打破外键,这样操作的结果就是约束也被 drop 了。

InnoDB 允许你撤消(drop)任何表,即使这样会打破被引用表的外键约束。 当你撤消一个表时约束也同时被撤销了。

如果重新创建一个被撤消的表,必须参考原有定义建立一致的外键约束。 必须有正确的列我与类型。必须在引用键上有索引。如果不符合上面的条件,MySQL 将返回1005 号错误,错误信息字符串提示错误号(errno) 150。

从 3.23.50 开始,通过下列指令可以使 InnoDB 返回表的外键约束定义

SHOW CREATE TABLE yourtablename
 
还可以通过 mysqldump 将表的完整定义转储到文件中,当然包括外键定义。

 

还可以通过下面的指令列出表 T 的外键约束:

SHOW TABLE STATUS FROM yourdatabasename LIKE 'T'
 
外键约束将会在表注释中列出。

 

4.4 自增列(auto-increment)是如何在 InnoDB 中工作的

如果表有一个自增(auto-increment)列,那么 InnoDB 表处理系统将它的数据字典中包含一个特别的计数器用以记录自增列的下一个列值。 自增计数器只放于主存中,而不是放在磁盘中。

 

InnoDB 使用下列规则初始化自增计数器。数据库启动后,当用户第一次向表 T 插入数据或运行 SHOW TABLE STATUS 来显示表 T 时,InnoDB 将执行

SELECT MAX(auto-inc-column) FROM T FOR UPDATE,
 
同时将所得值加 1 现填入字段并记录表的自增记录器。如果表是空的则将值赋为 1 。注意在这个初始化过程中将为表加一个读锁(a normal x-locking read),这个锁将一直持续到事务处理结束。

 

InnoDB 为一个新建立的表以同样的方式建立自增计数器。

如果为一个自增列特别指定值 0 ,那么 InnoDB 将视为未为该列指定值而将该列赋于新值。

在自增计数器初始化后,在自增列中插入一个明确指定的新值 ,并且该值大于当前计数值,那么计数器将被设置为新的指定值。如果用户没有明确为它指定一个值,InnoDB 将自增计 数器,并将新值赋于自增列。

当访问自增计数器时,InnoDB 将使用一个特殊的表级锁定( AUTO-INC lock ),锁将一直保持到当前 SQL 语句的运行结束,而不是线程的结束。特殊的锁释放策略被引入是为了改善向有自增字段的表中插入数据的并发性能。两个事务处理不能在同一张表上建立AUTO-INC 锁。

注意如果事务从自增计数器中取值,那么当事务回滚时在自增列顺序上可能会产生空隙。

如果给一个自增字段指定一个无效值或值比定义的整型类型最大值域还大,那么自增机制 的状态将无法预知。

4.5 InnoDB 和 MySQL 复制(replication)

MySQL 的复制特征(replication feature)在 InnoDB 表上的工作就与它在 MyISAM 表类型上一样。在 master 中的表类型与 slave 中的表类型是不一致时使用复制(replication)是可能的。举例来说,你可以将 master 中的一个 InnoDB 表的更改复制到一个 slave 中的 MyISAM 表中去。

为了设立一个 master 的新的 slave ,你必须建立一份 InnoDB 表空间和日志文件(log files)的复本,同样也包括 InnoDB 表相对应的 .frm 文件,并将这些复本移动到 slave 中。这看上去有点像下面 章节 7 关于移动一个 InnoDB 数据库的说明。如果你可以关闭 master,你可以建立一个 InnoDB 表空间和日志文件的冷备份(cold backup)来建立一个 slave。为了建立一个新的 slave 而不将 master 数据库关闭,你可以使用一个非免费的 InnoDB Hot Backup tool。

在 InnoDB 复制中的一引起小限制:

  • LOAD TABLE FROM MASTER 不能够在 InnoDB 表类型中使用。有工作区 1) 转储 master 中的表并将转储文件(dumpfile)导入 slave,或 2) 在 master 中进行ALTER tablename TYPE=MyISAM ,然后使用 LOAD TABLE tablename FROM MASTER,最后在 master 中将表更改回 InnoDB 类型。
  • 在 MySQL-4.0.6 先前的版本中,SLAVE STOP 不会注意有几个 SQL 语句的事务的边界。一个未完成的事务将会回滚,在下一个SLAVE START 时将会运行另外半个事务的剩余部份。这会使复制失败。
  • 在 MySQL-4.0.6 先前的版本中,在运行多语句事务过程中 slave 的崩溃将引起与 SLAVE STOP 同样的问题。
  • 在 MySQL-4.0.11 先前的版本中,语句 SET FOREIGN_KEY_CHECKS=0 的复制完全不能工作。

最后,一个较短的解释有关 MySQL 在 master 中处理事务复制失败。MySQL 的复制是基于二进制日志(binlog)的,它用于 MySQL 记录修改了数据的 SQL 语句。slave 读取 master 的二进制日志(binlog),并运行同样的 SQL 语句。如果一个语句失败,举例来说,由于违背一个外键约束 ,那么这个语句将不记入二进制日志中,因而也不复制到 slave 中。如果一个事务回滚了,那么事务中的 SQL 语句将不记入二进制日志中,同样这个事务在 slave 中根本也不会运行。

 

 

上一页  [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……
    咸宁网络警察报警平台