MySQL主键

时间:2019-11-20 08:52:12  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL主键约束来创建表的主键。

MySQL主键简介

主键是一列或一组列,它们唯一地标识表中的每一行。
主键遵循以下规则:

  • 主键必须包含唯一值。
    如果主键包含多个列,则这些列中的值组合必须唯一。

  • 主键列不能具有NULL值。
    任何将NULL插入或更新为主键列的尝试都将导致错误。
    请注意,MySQL向主键列隐式添加了NOT NULL约束。

  • 一个表可以只有一个主键。

由于MySQL使用整数的速度更快,因此主键列的数据类型应为整数,例如INT,BIGINT。
并且,应确保主键的整数类型的值范围足以存储表可能具有的所有可能的行。

主键列通常具有AUTO_INCREMENT属性,当您在表中插入新行时,该属性会自动生成一个连续整数。

当您为表定义主键时,MySQL自动创建一个称为PRIMARY的索引。

MySQL PRIMARY KEY示例

使用PRIMARY KEY约束可以在创建或更改表时定义表的主键。

1)在CREATE TABLE中定义一个PRIMARY KEY约束

通常,您可以在CREATE TABLE语句中为表定义主键。

如果主键具有一列,则可以将PRIMARY KEY约束用作列约束:

CREATE TABLE table_name(
    primary_key_column datatype PRIMARY KEY,
    ...
);

当主键具有多个列时,必须将PRIMARY KEY约束用作表约束。

CREATE TABLE table_name(
    primary_key_column1 datatype,
    primary_key_column2 datatype,
    ...,
    PRIMARY KEY(column_list)
);

在此语法中,您用逗号(,)分隔column_list中的列。

当主键具有一列时,可以使用PRIMARY KEY表约束:

CREATE TABLE table_name ( 
    primary_key_column datatype, 
    ... ,
    PRIMARY KEY(primary_key_column)
);

下面的示例创建一个名为users的表,其主键为user_id列:

CREATE TABLE users(
   user_id INT AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(40),
   password VARCHAR(255),
   email VARCHAR(255)
);

该语句创建具有PRIMARY KEY约束作为表约束的角色表:

CREATE TABLE roles(
   role_id INT AUTO_INCREMENT,
   role_name VARCHAR(50),
   PRIMARY KEY(role_id)
);

如果主键包含多个列,则必须在CREATE TABLE语句的末尾指定它们。
您将以逗号分隔的主键列列表放在括号内,紧跟在PRIMARY KEY关键字之后。

下面的示例创建一个user_roles表,该表的主键由两列组成:user_id和role_id。
它将PRIMARY KEY约束定义为表约束:

CREATE TABLE user_roles(
   user_id INT,
   role_id INT,
   PRIMARY KEY(user_id,role_id),
   FOREIGN KEY(user_id) 
       REFERENCES users(user_id),
   FOREIGN KEY(role_id) 
       REFERENCES roles(role_id)
);

请注意,该语句还创建了两个外键约束。

2)使用ALTER TABLE定义PRIMARY KEY约束

如果某个表由于某种原因没有主键,则可以使用ALTER TABLE语句将主键添加到表中,如下所示:

ALTER TABLE table_name
ADD PRIMARY KEY(column_list);

以下示例将id列添加到主键。

首先,创建不带主键的pkdemos表。

CREATE TABLE pkdemos(
   id INT,
   title VARCHAR(255) NOT NULL
);

其次,使用ALTER TABLE语句将主键添加到pkdemos表中:

ALTER TABLE pkdemos
ADD PRIMARY KEY(id);

如果将主键添加到已经有数据的表中。
将包含在主键中的列中的数据必须唯一且不能为NULL。

主键vs.唯一键vs.键

KEY是INDEX的同义词。
当您要为不属于主键或唯一键的一列或一组列创建索引时,可以使用KEY。

UNIQUE索引可确保列中的值必须唯一。
与PRIMARY索引不同,MySQL在UNIQUE索引中允许使用NULL值。
此外,一个表可以具有多个UNIQUE索引。

假设用户表中用户的电子邮件和用户名必须唯一。
要执行这些规则,您可以为email和username列定义UNIQUE索引,如下所示:

为用户名列添加一个UNIQUE索引:

ALTER TABLE users
ADD UNIQUE INDEX username_unique (username ASC) ;

为email列添加一个UNIQUE索引:

ALTER TABLE users
ADD UNIQUE INDEX  email_unique (email ASC) ;

在本教程中,您学习了如何为新表创建主键或如何向现有表添加主键。