在创建表stmt结束时定义主键和列名,在创建表stmt之后添加主键索引的区别



我看到过三种定义主键的方法:

  1. 定义及其列名定义:

    CREATE TABLE test (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -- other fields
    );
    
  2. 在表定义的末尾定义键:

    CREATE TABLE test (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -- other fields
    PRIMARY KEY (id)
    );
    
  3. 在表创建后添加主键索引。通常我在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存储引擎中,将数据插入到没有主键的表中可能会快一点。但是,您必须计算在完成插入数据后添加主键所花费的额外时间。

在任何情况下,您的示例都没有显示数据导入,因此没有意义。

最新更新