13.2.5 数据库约束 3.primary key约束

13.2.5 数据库约束 3.PRIMARY KEY约束

主键约束相当于非空约束和唯一约束,即主键约束的列既不允许出现重复值,也不允许出现null值如果对多列组合建立主键约束,则多列里包含的每一列都不能为空,但只要求这些列组合不能重复。主键列的值可用于唯一地标识表中的一条记录。
每一个表中最多允许有一个主键,但这个主键约束可由多个数据列组合而成,
主键是表中能唯一确定一行记录的字段或字段组合

建立主键约束时既可使用列级约束语法,也可使用表级约束语法。如果需要对多个字段建立组合主键约束,则只能使用表级约束语法
使用表级约束语法来建立约束时,可以为该约束指定约束名。但不管用户是否为该主键约束指定约束名,MySQL总是将所有的主键约束命名为PRIMARY
提示:
MySQL允许在建立主键约束时为该约束命名,但这个名字没有任何作用,这是为了保持与标准SQL的兼容性。大部分数据库都允许自行指定主键约束的名字,而且一旦指定了主键约束名,则该约束名就是用户指定的名字。
当创建主键约束时,MySQL在主键约束所在列或列组合上建立对应的唯一索引。
创建主键约束的语法和创建唯一约束的语法非常像,一样允许使用列级约束语法为单独的数据列创建主键,如果需要为多列组合建立主键约束或者需要为主键约束命名,则应该使用表级约束语法来建立主键约束。与建立唯一约束不同的是,建立主键约束使用primary key

列级别约束创建主键约束

建表时创建主键约束,使用列级约束语法:

1
2
3
4
5
create table primary_test
(
test_id int primary key,
test_name varchar(255)
);

表级别约束创建主键约束

建表时创建主键约束,使用表级约束语法:

1
2
3
4
5
6
7
8
create table primary_test2
(
test_id int not null,
test_name varchar(255),
test_pass varchar(255),
# 指定主键约束名为test2_pk,对大部分数据库有效,但对MySQL无效
constraint test2_pk primary key(test_id)
);

组合主键

建表时创建主键约束,以多列建立组合主键,只能使用表级约束语法:

1
2
3
4
5
6
7
create table primary_test3
(
test_name varchar(255),
test_pass varchar(255),
# 建立多列组合的主键约束
primary key(test_name,test_pass)
);

删除主键约束

如果需要删除指定表的主键约束,则在alter table语句后使用drop primary key子句即可。SQL语句如下:

1
2
alter table primary_test3
drop primary key;

增加主键约束

如果需要为指定表增加主键约束,既可通过modify修改列定义来增加主键约束,这将采用列级约束语法来增加主键约束;也可通过add来增加主键约束,这将采用表级约束语法来增加主键约束。SQL语句如下:

通过add添加主键约束

1
2
alter table primary_test3
add primary key(test_name,test_pass);

通过modify添加主键约束

如果只是为单独的数据列增加主键约束,则可使用modify修改列定义来实现,如下SQL语句所示:

1
2
alter table primary_test3
modify test_name varchar(255) primary key;

注意
不要连续执行上面两条SQL语句,因为上面两条SQL语句都是为primary_test3增加主键约束,而同一个表里最多只能有一个主键约束,所以连续执行上面两条SQL语句肯定出现错误。为了避免这个问题,可以在成功执行了第一条增加主键约束的SQL语句之后,先将primary_test3里的主键约束删除后再执行第二条增加主键约束的SQL语句。

自动增长列

很多数据库对主键列都支持一种自增长的特性——如果某个数据列的类型是整型,而且该列作为主键列,则可指定该列具有自增长功能。指定自增长功能通常用于设置逻辑主键列——该列的值没有任何物理意义,仅仅用于标识每行记录。MySQL使用auto_increment来设置自增长,SQL语句如下:

1
2
3
4
5
6
create table primary_test4
(
test_id int auto_increment primary key,
test_name varchar(255);
test_pass varchar(255)
);

一旦指定了某列具有自增长特性,则向该表插入记录时可不为该列指定值,该列的值由数据库系统自动生成。