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。