我看到过三种定义主键的方法:
-
定义及其列名定义:
CREATE TABLE test ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- other fields );
-
在表定义的末尾定义键:
CREATE TABLE test ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, -- other fields PRIMARY KEY (id) );
-
在表创建后添加主键索引。通常我在phpMyAdmin导出的.sql文件中看到过这种情况。(是否取决于所使用的存储引擎?)
CREATE TABLE test ( id INT UNSIGNED NOT NULL, -- other fields ); ALTER TABLE test ADD PRIMARY KEY (id), MODIFY id INT UNSIGNED NOT NULL AUTO_INCREMENT;
所有这些方法之间的内部差异是什么?
大多数情况下,我看到使用第三种方法导入SQL文件比使用其他方法需要更长的时间。
编辑 Bill Karwin
上面的例子不包含INSERT
查询,但是如果在每个CREATE TABLE
查询之后都有INSERT
语句来插入数据,会有什么不同呢?
前两种形式没有区别。如果主键是单列,这只是语法上的方便。但是,如果有多列主键,则必须将PK定义为表约束:
CREATE TABLE test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
other INT NOT NULL,
-- other fields
PRIMARY KEY (id, other)
);
第三种形式几乎相同,因为在向表中插入任何数据之前定义了主键。唯一的影响是元数据被第二个DDL语句修改。
有些人声称在导入数据后添加主键会更快,但对于MySQL的默认存储引擎InnoDB来说并非如此。表数据存储为聚集索引。如果不声明自己的主键,则会隐式地创建另一个行id,这将成为聚集索引的键。所以你是在以这样或那样的方式插入索引
在旧的MyISAM存储引擎中,将数据插入到没有主键的表中可能会快一点。但是,您必须计算在完成插入数据后添加主键所花费的额外时间。
在任何情况下,您的示例都没有显示数据导入,因此没有意义。