为什么mysiam不支持外键,事务

知其然,不知其所以然!

我们都知道mysiam不支持外键和事务。 Innodb支持事务和外键。 5.6版本以后默认的引擎是Innodb。

那么为什么Mysiam不支持外键和事务呢?

1. 先说外键。

  外键的作用是什么? 保持数据完整性。

  

  这张图,没有数据一致性的约束。

  换句话说,artist_id在artist表中有没有是无所谓的。

  在关系数据库年代,我们要约束数据一致性,这种设计肯定不行,所以我们会加上外键约束。

  但是早期数据库设计的时候,和Excel表没有区别,只是用来存数据的。 所以mysiam不支持外键。 在13年的版本更迭中,有计划加入支持外键,但后续取消了。

2. 再说事务

  从设计的角度来说, Mysiam设计的是非聚簇索引,B+树(?是B+树吗?为什么官方文档8.0是写的B树?有空再看下。)的叶节点存的都是指针。所以读取的所读非常快。 并且所有的写入都是加在表的最后一行。

  我自己的理解。 设计就是这样。 Mysiam不支持数据恢复。数据存储的格式是指针引用。理论上可以支持,但是开销大。所以人为设计不支持。 Innodb叶节点就是数据。 支持行锁,所以支持事务比较简单。

原文地址:https://www.cnblogs.com/althus/p/11623380.html

时间: 2024-10-09 14:44:39

为什么mysiam不支持外键,事务的相关文章

SQLite从什么版本开始支持外键(Foreign Key)

http://androidren.com/index.php?qa=298&qa_1=sqlite%E4%BB%8E%E4%BB%80%E4%B9%88%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E6%94%AF%E6%8C%81%E5%A4%96%E9%94%AE-foreign-key 从SQLite 3.6.19 开始支持 外键约束. 参考: http://sqlite.org/foreignkeys.html Foreign key constraints

MySql不支持主外键

创建表不支持主外键,能够添加外键成功,但是无法外键约束.查资料发现MySql的默认ENGINE 为MyISAM  ,不支持外键,需要修改为 INNODB 修改前: 1 Create Table 2 3 CREATE TABLE `person` ( 4 `id` varchar(32) NOT NULL, 5 `NAME` varchar(30) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7 ) ENGINE=InnoDB DEFAULT CHARSET=gbk 在创

[转载]数据库外键的使用

[转载]数据库外键的使用 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 b表中存有每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触

数据库外键的使用

外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 b表中存有每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制: on delet

MySQL 外键

在MySQL中 (1)MySQL 数据表主要支持六种类型 ,分别是:BDB.HEAP.ISAM.MERGE.MYISAM.InnoBDB.这六种又分为两类,一类是”事务安全型”(transaction-safe),包括BDB和InnoDB:其余都属于第二类,称为”非事务安全型”(non-transaction-safe). InnoDB 是较新的事务安全型存储引擎,用于事务处理应用程序,支持BDB的几乎所有特性,并具有众多新特性,包括ACID事务支持. 特性: 事务处理机制 支持外链 崩溃后能立

Android数据库SQLite表内设置外键

Android数据库SQLite表内设置外键 介绍 Android默认的数据是SQLite,但SQLite3.6.19之前(在2.2版本中使用的是3.6.22,因此如果你的应用只兼容到2.2版本就可以放心使用外键功能)是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图. 现有两张表 Employees Dept 视图 ViewEmps:显示雇员信息和他所在的部门 创建数据库 自定义一个辅助类继承SQ

mysql|中主外键关系(转)

http://my.oschina.net/liting/blog/356150 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就

mysql中主外键关系

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

MySQL基础day03 存储引擎和外键MySQL 5.6

MySQL基础day03_存储引擎和外键-MySQL 5.6 外键的条件: 1,表的存储引擎为innodb存储引擎 2,表中外键字段的类型要与参考表的字段类型一致 3,外键字段要是索引类型中的一种 MySQL数据库的存储引擎 存储引擎:是mysql结构中的组成部分 mysql体系结构: 由8部分组成:连接池.Sql接口.分析器.优化器.缓存和缓冲.存储引擎.管理工具.物理存储设备 1.客户端:mysql 2.连接器: NativeC API 本地C语言接口.JDBCJAVA的数据库连接器.ODB