15

我对这里的伤害散布感到很困惑。

我知道怎么做,见下文,但不知道为什么?它们是干什么用的?

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));
4

10 回答 10

18

InnoDB 是MySQL 中的存储引擎。其中有不少,它们都有其优点和缺点。InnoDB 最大的优势是:

  • 支持事务(为您提供对ACID属性的支持)。
  • 行级锁定。与例如MyISAM相比,拥有更细粒度的锁定机制可以为您提供更高的并发性。
  • 外键约束。让你让数据库保证数据库状态的完整性,以及表之间的关系。
于 2009-07-04T13:30:14.503 回答
12

总是。除非您需要使用 MySQL 的全文搜索或 InnoDB 在您的共享虚拟主机中被禁用。

于 2009-07-04T20:26:16.277 回答
4

InnoDB:

MySQL 中的 InnoDB 存储引擎。InnoDB 是 MySQL 的高可靠高性能存储引擎。InnoDB 的主要优势包括:

  • 它的设计遵循 ACID 模型,具有提交、回滚和崩溃恢复功能的事务来保护用户数据。
  • 行级锁定(不升级到更粗粒度的锁定)和 Oracle 风格的一致性读取提高了多用户并发性和性能。
  • InnoDB 表在磁盘上排列您的数据,以优化基于主键的常见查询。每个 InnoDB 表都有一个称为聚集索引的主键索引,用于组织数据以最小化主键查找的 I/O
  • 为了维护数据完整性,InnoDB 还支持 FOREIGN KEY 引用完整性约束。
  • 您可以自由地将 InnoDB 表与来自其他 MySQL 存储引擎的表混合,即使在同一语句中也是如此。例如,您可以使用连接操作将 InnoDB 和 MEMORY 表中的数据组合到单个查询中。

InnoDB 限制:

  • 无全文索引(mysql 5.6以下版本)

  • 无法压缩以实现快速、只读

更多细节:

参考这个链接

于 2014-04-08T07:12:15.890 回答
3

我认为您对两个不同的问题感到困惑,即何时使用 InnoDB 而不是 MyISAM,以及何时使用外键 (FK) 约束。

至于第一个问题,已经有很多答案很好地解释了 MyISAM 和 InnoDB 之间的区别。我只是重申一下,在 tvanfosson 引用的一篇文章中,MyISAM 更适合以读取为主的系统。这是因为它使用表级锁定而不是像 InnoDB 那样的行级锁定,因此 MyISAM 也无法处理高并发,而且它缺少有助于数据完整性的功能,例如事务和外键(同样,其他人已经提到过)。

您不必在数据模型中使用 FK 约束。如果您知道表之间的关系是什么,并且您的应用程序没有错误,那么没有 FK 就可以了。 但是,使用 FK 可以在数据库层为您提供额外的保障,因为 MySQL 不会让您的应用程序根据您创建的约束插入错误数据。

如果您不清楚为什么要使用主键 (PK),则创建一个列(id_order例如表的 PK)orders意味着 MySQL 不会让您多次INSERT使用相同的值,因为 PK 中的每一行id_order列必须是唯一的。

FK 将用于依赖于另一个表的表,例如,order_items将依赖于orders(下)。 id_order_items是 的 PK ,order_items您可以使表id_order_items的 FK在和orders之间建立一对多的关系。同样,可以是表中的 FK 和表中的 PK,以在和之间建立一对多的关系。ordersorder_itemsid_itemorder_itemsitemsorder_itemsitems

**然后,FK 约束的作用是阻止您添加id_item value to theorder_items table that isn't in theitems table, or from adding aid_order_items toorders that isn't in theorder_items `表。

FK 所做的只是确保数据完整性,它还有助于将表之间的关系传达给没有编写系统的其他开发人员(以及几个月后你忘记的自己!),但主要是为了数据完整性。**

额外信用:那为什么要使用交易? 好吧,您已经提到过一句话,说它们对银行系统很有用,但它们在更多情况下有用。

基本上,在关系数据库中,特别是在规范化的情况下,添加订单、更新订单或删除订单等常规操作通常会涉及多个表和/或涉及多个 SQL 语句。您甚至可以多次触摸同一张桌子(如下例所示)。顺便说一句,数据操作语言 (DML) 语句 ( INSERT/ UPDATE/ DELETE) 一次只涉及一个表。

添加订单的示例:

我推荐一张orders桌子和一张order_items桌子。这使得您可以id_orderorders表格中进行 PK,这意味着id_order不能在orders. 如果没有一对多的orders关系,对于每个有多个关联项目的订单,您必须order_items在表中有多行(顺便说一句,这个电子商务系统也需要一个表)。此示例将添加一个订单并使用 4 个不同的语句来接触 2 个表。ordersitemsINSERT

(没有用于说明目的的关键约束)

-- insert #1
INSERT INTO orders (id_order, id_order_items, id_customer)
VALUES (100, 150, 1)

-- insert #2
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 1)

-- insert #3
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 2)

-- insert #4
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 3)

那么如果insert #1insert #2查询成功运行,但insert #3语句没有运行怎么办?您最终会得到一个缺少商品的订单,这将是垃圾数据。如果在这种情况下,您想要回滚所有查询,以便数据库处于添加订单之前的相同状态,然后重新开始,那么这正是事务的用途。**您将您希望全部完成的查询组合在一起,或者在出现异常的情况下,然后根本没有,将它们组合到一个事务中。

因此,与 PK/FK 约束一样,事务有助于确保数据完整性。**

于 2010-07-20T19:01:37.550 回答
2

在您的示例中,您创建外键。只有 InnoDB 表支持外键,MyISAM 表不支持。

于 2009-07-04T13:29:05.393 回答
2

您可能对Database Journal 中讨论 MySQL 中的 InnoDB 表类型的这篇文章感兴趣。

摘抄:

上个月我们研究了 HEAP 表类型,一种完全在内存中运行的表类型。本月我们将研究设置 InnoDB 表类型,这是严肃用户最感兴趣的类型。标准的 MyISAM 表类型非常适合网站使用,与写入相比,读取次数较多,并且没有事务。在这些条件不适用的地方(除了网站,它们在数据库世界中并不经常适用),InnoDB 表很可能是选择的表类型。本文面向熟悉 MySQL,但只使用过默认 MyISAM 表类型的用户。

我不会被另一个问题推迟。保留任何类型的数据库的正确备份——并且不要意外删除表;-)——无论你选择什么表类型都可以。

于 2009-07-04T13:30:41.413 回答
1

一般来说,对我来说最重要的一点是 InnoDB 提供每行锁定,而 MyISAM 确实按表查看。在具有大量写入的大表上,这可能会造成很大的性能问题。

另一方面,MyISAM 表具有更简单的文件结构,在文件级别复制和修复表更容易。

于 2009-07-04T15:23:11.483 回答
1

评论有一个命令来将你的数据库转换为 InnoDB这里。

于 2009-07-05T14:33:05.827 回答
0

到处!弃用 myisam,innodb 是要走的路。不仅关乎性能,还关乎数据完整性和酸性事务。

于 2009-07-04T13:28:31.650 回答
0

Machineknoopx关于交易的回答的补充:

默认的 MySQL 表类型 MyISAM 不支持事务。BerkeleyDB 和InnoDB 是开源 MySQL 3.23.34 及更高版本中可用的事务安全表类型。

交易的定义和银行示例

事务是组合在一起的一系列单独的数据库操作。-- 交易有用的一个很好的例子是银行业。

引文来源

于 2009-07-05T14:06:59.937 回答