create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,primary key(a,b));
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,unique (a,b));
是否有任何功能上的差异?
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,primary key(a,b));
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,unique (a,b));
是否有任何功能上的差异?
看一看The difference between a unique index and primary key in MySQL
的唯一索引创建约束 使得索引中的所有值必须 是不同的。如果您尝试使用与现有行匹配的键值 添加新行,您会发生错误。此限制不适用于NULL 值,但BDB存储器 引擎除外。对于其他引擎,独特的 指数允许可以包含NULL
是的,你只能有一个主键,但是你可以拥有任意数量的唯一索引。
不,我不需要很多独特的索引,因为只有2列,在这种情况下是否有任何区别? – user198729 2010-02-21 11:31:04
您可能不需要它们,但仍可以创建它们。 – 2010-02-21 11:32:38
主键一样,不过唯一索引 列多NULL值:
由于它们不能有NULL,主键必须唯一标识一行。
是否有任何功能差异?
在一般primary key
和unique
约束之间的区别在于,你可以创建可空列后者。也就是说,您可以在columsn上创建一个未明确声明为NOT NULL
的主键,但由于添加了主键,这些主键将自动变为不可空。此外,您只能有一个主键,但有许多独特的约束。
现在,在您的示例代码中,无论如何这两列都是NOT NULL
,所以功能上primary key
和unique
约束之间不会有任何区别。但是这种明显不存在差异仅适用于表的逻辑关系属性。存储引擎级别可能仍然存在差异。
例如,innodb存储引擎使用聚簇索引:表数据存储在为主键创建的索引的叶节点中。所以如果你有一个没有主键的innodb表,innodb仍然会在下面创建一个表,你的唯一索引将指向主键。其他引擎(如NDB群集引擎)如果未明确定义主引擎,也会自动创建主键,在这种情况下,任何二级索引(如唯一索引)都将指向主键中的实体。在这两种情况下,这些二级索引通常比首先定义为主键的时候要慢。
在MySQL中,还存在与主键和唯一约束有关的另一个区别。如果要创建列,并且该列必须是主键的一部分(通常,主键仅包含auto_increment
列)
除了这些技术差异之外,还有一个约定的问题考虑。 alwyas定义一个主键被认为是一个好习惯 - 基本上你会说,“这是在这个表格中识别一行的标准方式”。如果将它排除在外,将会产生混淆,因为它看起来像忘了定义一个。
看看你的定义* b整数无符号** NOT NULL ** * – 2010-02-21 11:42:04
IMO,这个anwser是不完整的。还有更多 - 参见尼尔和我的回答了解更多信息。 – 2010-02-21 11:51:55
我的意思是:MarkR,不是Neil的。 – 2010-02-21 20:14:30