使用主键创建表
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
列的副本。