作用
关键字
特点
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
- 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
- 主键约束对应着表中的一列或者多列(复合主键)
- 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
- 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
- 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
添加主键约束
在创建表时添加主键约束
基本语法
create table 表名称(
字段名 数据类型 primary key, #列级模式
字段名 数据类型,
字段名 数据类型
);
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] primary key(字段名) #表级模式
);
例子
```sql一个表中最多只能有一个主键约束。
错误:Multiple primary key defined
CREATE TABLE test3( id INT PRIMARY KEY, #列级约束 last_name VARCHAR(15) PRIMARY KEY, salary DECIMAL(10,2), email VARCHAR(25) );
主键约束特征:非空且唯一,用于唯一的标识表中的一条记录。
CREATE TABLE test4( id INT PRIMARY KEY, #列级约束 last_name VARCHAR(15), salary DECIMAL(10,2), email VARCHAR(25) );
MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
CREATE TABLE test5( id INT , last_name VARCHAR(15), salary DECIMAL(10,2), email VARCHAR(25),
表级约束
CONSTRAINT pk_test5_id PRIMARY KEY(id) #没有必要起名字。 );
SELECT * FROM information_schema.table_constraints WHERE table_name = ‘test5’;
INSERT INTO test4(id,last_name,salary,email) VALUES(1,’Tom’,4500,’tom@126.com’);
错误:Duplicate entry ‘1’ for key ‘PRIMARY’
INSERT INTO test4(id,last_name,salary,email) VALUES(1,’Tom’,4500,’tom@126.com’);
错误:Column ‘id’ cannot be null
INSERT INTO test4(id,last_name,salary,email) VALUES(NULL,’Tom’,4500,’tom@126.com’);
SELECT * FROM test4;
<a name="lxzH9"></a>
## 建表后添加主键约束
<a name="mGJpX"></a>
### 基本语法
```sql
#字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键
ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);
例子
# 在ALTER TABLE时添加约束
CREATE TABLE test6(
id INT ,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);
DESC test6;
ALTER TABLE test6
ADD PRIMARY KEY (id);
复合主键约束
基本语法
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
primary key(字段名1,字段名2) #表示字段1和字段2的组合是唯一的,也可以有更多个字段
);
例子
CREATE TABLE user1(
id INT,
NAME VARCHAR(15),
PASSWORD VARCHAR(25),
PRIMARY KEY (NAME,PASSWORD)
);
#如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
INSERT INTO user1
VALUES(1,'Tom','abc');
INSERT INTO user1
VALUES(1,'Tom1','abc');
#错误:Column 'name' cannot be null
INSERT INTO user1
VALUES(1,NULL,'abc');
SELECT * FROM user1;
删除主键约束
基本语法
注意:在实际开发中,不会去删除表中的主键约束!
alter table 表名称 drop primary key;
例子
ALTER TABLE test6
DROP PRIMARY KEY;