我对受伤害的人here感到困惑。
我知道怎么做,见下文,但不明白为什么?它们用于什么?
create table orders (order_no int not null auto_increment, FK_cust_no int not null,
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB;
create table orders (order_no int not null auto_increment, FK_cust_no int not null,
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no));
答案 0 :(得分:17)
InnoDB是storage engine in MySQL。它们中有不少,它们各有利弊。 InnoDB的最大优势是:
答案 1 :(得分:12)
始终。除非您需要使用MySQL的全文搜索,否则在您的共享虚拟主机中禁用InnoDB。
答案 2 :(得分:3)
我认为您对两个不同的问题感到困惑,何时使用InnoDB而不是MyISAM,以及何时使用外键(FK)约束。
至于第一期,有很多答案可以很好地解释MyISAM和InnoDB之间的差异。我只想重申一下,在tvanfosson的文章引用中,MyISAM更适合用于大多数读取的系统。这是因为它使用表级锁定而不是像InnoDB那样的行级别,因此MyISAM也不能处理高并发性,加上它缺少有助于数据完整性的功能,例如事务和外键(再次,已经被其他人提及)。
您不必在数据模型中使用FK约束。如果您知道表之间的关系是什么,并且您的应用程序没有错误,那么您将在没有FK的情况下顺利完成。 但是,使用FK可以在数据库层为您提供额外的保险,因为MySQL不会让您的应用程序根据您创建的约束插入错误的数据。
如果您不清楚为什么要使用主键(PK),那么创建id_order
之类的列,例如orders
表的PK就意味着MySQL不会让你INSERT
id_order
的值不止一次,因为PK列中的每一行都必须是唯一的。
FK将用于对另一个表具有依赖性的表,例如,order_items
将依赖于orders
(下面)。 id_order_items
是order_items
的PK,您可以id_order_items
orders
表的FK,以建立orders
和order_items
之间的一对多关系{1}}。同样,id_item
可以是order_items
表中的FK和items
表中的PK,以建立order_items
和{{1}之间的一对多关系}。
**然后,FK约束的作用是阻止您添加items
order_items id_item value to the
项table that isn't in the
id_order_items table, or from adding a
订单to
order_items`表
所有FK所做的就是确保数据的完整性,它还有助于将您的表之间的关系传达给未编写系统的其他开发人员(以及几个月后您忘记了!),但主要是数据完整性。* *
额外信用:那么为什么要使用交易?那么你已经提到了一个引用它说它们对银行系统很有用的说法,但它们在更多的情况下是有用的。
基本上,在关系数据库中,特别是如果它是normalized,例如添加订单,更新订单或删除订单等常规操作通常会触及多个表和/或涉及多个SQL声明。您甚至可以多次触摸同一个表(如下例所示)。 Btw数据操作语言(DML)语句(that isn't in the
/ INSERT
/ UPDATE
)一次只涉及一个表。
添加订单的示例:
我建议使用DELETE
表和orders
表。这样就可以在order_items
表中的id_order
上设置PK,这意味着orders
无法重复id_order
。如果没有1对多orders
- orders
关系,则必须在order_items
表中为每个与其关联的多个项目的订单设置多行(您需要一个这个电子商务系统的orders
表也是如此。此示例将添加一个订单,并使用4个不同的items
语句触摸2个表。
(没有关键限制用于说明目的)
INSERT
那么,如果插入#1 和插入#2 查询成功运行,但 insert#3 语句没有?您最终会得到一个缺少项目的订单,这将是垃圾数据。如果在这种情况下,您想要回滚所有查询,那么数据库处于添加订单之前的状态,然后重新开始,这正是交易的用途。 **您将要求所有这些查询完成的查询组合在一起,或者在异常的情况下,然后根本不将这些查询组合到一个事务中。
与PK / FK约束一样,事务有助于确保数据完整性。**
答案 3 :(得分:3)
<强> InnoDB的:强>
MySQL中的InnoDB存储引擎。 InnoDB是MySQL的高可靠性和高性能存储引擎。 InnoDB的主要优势包括:
InnoDB限制:
没有全文索引(低于5.6 mysql版本)
无法快速压缩,只读
更多详情:
请参阅此link
答案 4 :(得分:2)
在您的示例中,您将创建外键。外键仅支持InnoDB表,而不支持MyISAM表。
答案 5 :(得分:2)
您可能对Database Journal中的this article感兴趣,后者讨论了MySQL中的InnoDB表类型。
摘录:
上个月我们查看了HEAP表 type,一个完全运行的表类型 在记忆中。本月我们来看看 设置InnoDB表类型, 最感兴趣的类型 用户。标准的MyISAM表类型 是网站使用的理想选择 与...相比,有许多读数 写道,没有交易。哪里 这些条件不适用(和 除了网站,他们不适用 经常在数据库世界里) InnoDB表很可能是表 选择的类型。本文的目的是 在熟悉MySQL的用户, 但只使用了默认的MyISAM 表类型。
我不会被另一个问题推迟。保持对数据库的任何类型的适当备份 - 并且不要意外丢弃表;-) - 并且无论您选择哪种表类型都可以。
答案 6 :(得分:1)
到处!弃用myisam,innodb是要走的路。不仅仅是性能,还有数据完整性和酸交易。
答案 7 :(得分:1)
总的来说,最重要的一点是InnoDB提供了每行锁定,而MyISAM确实可以查看每个表。在有大量写入的大表上,这可能会产生很大的性能问题。
另一方面,MyISAM表具有更简单的文件结构,在文件级复制和修复表更容易。
答案 8 :(得分:1)
注释具有将数据库转换为InnoDB here.
的命令答案 9 :(得分:0)
默认的MySQL 表类型,MyISAM,不支持 交易。 BerkeleyDB和 InnoDB 是事务安全表类型 在开源MySQL中可用, 版本3.23.34及更高版本。
交易的定义和银行业务示例
交易是一系列的 个人数据库操作 被组合在一起。 - 一个好的 交易有用的例子 在银行业。