使用主键创建表

CREATE TABLE Person (
    PersonID     INT UNSIGNED NOT NULL,
    LastName     VARCHAR(66) NOT NULL,
    FirstName    VARCHAR(66),
    Address      VARCHAR(255),
    City         VARCHAR(66),
    PRIMARY KEY (PersonID)
);

一个主键是一个单 NOT NULL 或它唯一地标识一个表的一行多列的标识符。创建了一个索引 ,如果没有显式声明为 NOT NULL,MySQL 会默默地和隐式地声明它们。

一张桌子只能有一个 PRIMARY KEY,建议每张桌子都有一个。InnoDB 会在没有的情况下自动创建一个(如 MySQL 文档中所示 ),尽管这不太理想。

通常,AUTO_INCREMENT INT 也称为代理键,用于精简索引优化和与其他表的关系。每当添加新记录时,此值将(通常)增加 1,从默认值 1 开始。

然而,尽管它的名字,它的目的不是保证价值是增量的,而只是它们是连续的和独特的。

如果删除表中的所有行,则自动递增 INT 值将不会重置为其默认起始值​​,除非使用 TRUNCATE TABLE 语句截断该表。

将一列定义为主键(内联定义)

如果主键由单个列组成,则 PRIMARY KEY 子句可以与列定义内联:

CREATE TABLE Person (
    PersonID     INT UNSIGNED NOT NULL PRIMARY KEY,
    LastName     VARCHAR(66) NOT NULL,
    FirstName    VARCHAR(66),
    Address      VARCHAR(255),
    City         VARCHAR(66)
);

这种形式的命令更短,更容易阅读。

定义多列主键

还可以定义包括多于一列的主键。这可以在例如外键关系的子表上完成。通过在单独的 PRIMARY KEY 子句中列出参与列来定义多列主键。此处不允许使用内联语法,因为只有一列可以声明为 PRIMARY KEY inline。例如:

CREATE TABLE invoice_line_items (
    LineNum      SMALLINT UNSIGNED NOT NULL,
    InvoiceNum   INT UNSIGNED NOT NULL,
    -- Other columns go here
    PRIMARY KEY (InvoiceNum, LineNum),
    FOREIGN KEY (InvoiceNum) REFERENCES -- references to an attribute of a table
);

请注意,主键的列应按逻辑排序顺序指定,这可能与列定义的顺序不同,如上例所示。

较大的索引需要更多的磁盘空间,内存和 I / O. 因此,键应尽可能小(特别是关于组合键)。在 InnoDB 中,每个二级索引都包含 PRIMARY KEY 列的副本。