MySQL CREATE TABLE语句中的PRIMARY KEY定义

54

这段代码有什么区别:

CREATE TABLE samples (
  sampleid INT(11) NOT NULL AUTO_INCREMENT,
  sampledate DATE NOT NULL,
  location VARCHAR(25) NOT NULL,
  PRIMARY KEY (sampleid)
)
ENGINE=InnoDB;

以及这个:

CREATE TABLE samples (
  sampleid INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  sampledate DATE NOT NULL,
  location VARCHAR(25) NOT NULL,
)
ENGINE=InnoDB;

如何编写主键/唯一索引的代码?是单独使用PRIMARY KEY语句还是作为列定义的一部分?同样的问题也适用于UNIQUE INDEX和UNIQUE关键字在列定义中的使用。


两者是相同的,不是吗?只是写法不同。 - Pramendra Gupta
1
我并不完全同意,可以看看@thomasrutter的回答。 - waanders
5个回答

50
第二种语法仅是一种快捷方式,允许您在单个子句中指定列并在其上添加索引。
如果您只想创建一个列并在其上添加索引,则可以使用此语法。
如果您想执行更复杂的操作,例如基于多个列而不是单个列添加索引,或者如果您正在添加或更改现有列上的索引,则需要使用第一种语法;也就是说,您不能同时创建列和索引。

5
谢谢!我喜欢附有论据的回答。 - waanders

4
MySQL允许使用PRIMARY KEY指令动态设置主键。将PRIMARY KEY作为构造函数的参数仅可在创建列时调用。PRIMARY KEY(X),PRIMARY KEY(Y),PRIMARY KEY(Z)允许在后续查询中更改主键。

1
我认为,第一种方法用于创建复合键。而第二种方法(对我来说更易读)主要用于表中只有一个主键的情况。
如果您想实现复合键,则无法使用第二种方法。

0

有许多方法可以解决问题,上述的两个例子只是其中的两种。它们是完全相同的,没有任何区别。


我并不完全同意,可以看看@thomasrutter的回答。 - waanders
更准确地说,他提供的这两个例子做的事情完全相同,但前者比后者允许更多的功能。 - Steen Schütt

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接