MySQL 使用主键创建表

示例

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内联。例如:

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。