2010-02-21 79 views
1
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,primary key(a,b)); 

而且MySQL中两个DDL有什么区别?

create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,unique (a,b)); 

是否有任何功能上的差异?

回答

0

看一看The difference between a unique index and primary key in MySQL

的唯一索引创建约束 使得索引中的所有值必须 是不同的。如果您尝试使用与现有行匹配的键值 添加新行,您会发生错误。此限制不适用于NULL 值,但BDB存储器 引擎除外。对于其他引擎,独特的 指数允许可以包含NULL

+0

看看你的定义* b整数无符号** NOT NULL ** * – 2010-02-21 11:42:04

+0

IMO,这个anwser是不完整的。还有更多 - 参见尼尔和我的回答了解更多信息。 – 2010-02-21 11:51:55

+0

我的意思是:MarkR,不是Neil的。 – 2010-02-21 20:14:30

1

是的,你只能有一个主键,但是你可以拥有任意数量的唯一索引。

+0

不,我不需要很多独特的索引,因为只有2列,在这种情况下是否有任何区别? – user198729 2010-02-21 11:31:04

+0

您可能不需要它们,但仍可以创建它们。 – 2010-02-21 11:32:38

0

主键一样,不过唯一索引 列多NULL值:

  • 不能包含空列
  • 部分存储引擎治疗它们有所不同 - 例如,InnoDB将主键集中在一起,有时这可能是一件好事,偶尔会成为一件坏事,但主要不是问题。

由于它们不能有NULL,主键必须唯一标识一行。

1

是否有任何功能差异?

在一般primary keyunique约束之间的区别在于,你可以创建可空列后者。也就是说,您可以在columsn上创建一个未明确声明为NOT NULL的主键,但由于添加了主键,这些主键将自动变为不可空。此外,您只能有一个主键,但有许多独特的约束。

现在,在您的示例代码中,无论如何这两列都是NOT NULL,所以功能上primary keyunique约束之间不会有任何区别。但是这种明显不存在差异仅适用于表的逻辑关系属性。存储引擎级别可能仍然存在差异。

例如,innodb存储引擎使用聚簇索引:表数据存储在为主键创建的索引的叶节点中。所以如果你有一个没有主键的innodb表,innodb仍然会在下面创建一个表,你的唯一索引将指向主键。其他引擎(如NDB群集引擎)如果未明确定义主引擎,也会自动创建主键,在这种情况下,任何二级索引(如唯一索引)都将指向主键中的实体。在这两种情况下,这些二级索引通常比首先定义为主键的时候要慢。

在MySQL中,还存在与主键和唯一约束有关的另一个区别。如果要创建列,并且该列必须是主键的一部分(通常,主键仅包含auto_increment列)

除了这些技术差异之外,还有一个约定的问题考虑。 alwyas定义一个主键被认为是一个好习惯 - 基本上你会说,“这是在这个表格中识别一行的标准方式”。如果将它排除在外,将会产生混淆,因为它看起来像忘了定义一个。