MySQL---‘PRIMARY KEY’的使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:


一、定义:

主键(PRIMARY KEY),又称主码,是表中一列或多列的组合。

MySQL主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行

这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。

 

二、选取设置主键约束的字段:

主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符;主键可以 是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键

 

规则:

Ø  每个表只能定义一个主键。

Ø  唯一性原则(主键值必须唯一标识表中的每一行,且不能为NULL,即表中不可能存在两行数据有相同的主键值).

Ø  一个列名只能在复合主键列表中出现一次。

Ø  最小化原则(复合主键不能包含不必要的多余列;当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的)

三、主键的类型:单字段主键和多字段联合主键。

1.单字段主键

(1)在创建表时设置主键约束,语法规则:

   字段名 数据类型 PRIMARY KEY [默认值];

实例1:在test_db数据库中创建tb_emp1数据表,其主键为idSQL语句如下

mysql> create table tb_emp1

  -> (

  -> id int(11) primary key,

  -> name varchar(25),

  -> deptid int(11),

  -> salary float

  -> );

Query OK, 0 rows affected (0.01 sec)

 

(2) 在定义完所有列之后指定主键,语法规则:

    [CONSTRAINT <约束名>] PRIMARY KEY [字段名];

实例2:创建tb_emp2数据表,其主键为idSQL语句如下

mysql> create table tb_emp2

  -> (

  -> id int(11),

  -> name varchar(25),

  -> deptid int(11),

  -> salary float,

  -> primary key(id)

  -> );

Query OK, 0 rows affected (0.01 sec)

mysql> show create table tb_emp2\G;

*************************** 1. row ***************************

     Table: tb_emp2

Create Table: CREATE TABLE `tb_emp2` (

`id` int(11) NOT NULL DEFAULT '0',

`name` varchar(25) DEFAULT NULL,

`deptid` int(11) DEFAULT NULL,

`salary` float DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk

1 row in set (0.00 sec)

2.多字段联合主键:

 语法规则:

   PRIMARY KEY [字段1,字段2,……,字段n];

实例3:创建数据表tb_emp3,假设表中没有主键id,为了唯一确定一个员工,可以把namedeptid联合起来作为主键,SQL语句如下

mysql> create table tb_emp3

  -> (

  -> name varchar(25),

  -> deptid int(11),

  -> salary float,

  -> primary key(name,deptid)

  -> );

Query OK, 0 rows affected (0.01 sec)

 

mysql> show create table tb_emp3\G;

*************************** 1. row ***************************

     Table: tb_emp3

Create Table: CREATE TABLE `tb_emp3` (

`name` varchar(25) NOT NULL DEFAULT '',

`deptid` int(11) NOT NULL DEFAULT '0',

`salary` float DEFAULT NULL,

PRIMARY KEY (`name`,`deptid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk

1 row in set (0.00 sec)

 

3.在修改表时添加主键约束

 语法规则:

   ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);

 

实例4:查看tb_emp2数据表的表结构

 

mysql> desc tb_emp2;

+--------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| id    | int(11)     | NO   |    | 0       |       |

| name  | varchar(25) | YES  |     | NULL   |       |

| deptid | int(11)     | YES |     | NULL    |      |

| salary | float       | YES |     | NULL    |      |

+--------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

修改数据表tb_emp2,将字段id设置为主键,SQL语句如下:

mysql> alter table tb_emp2 add primary key(id);

Query OK, 0 rows affected (0.02 sec)

Records: 0 Duplicates: 0  Warnings: 0

 

mysql> desc tb_emp2;

+--------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| id    | int(11)     | NO   | PRI | 0       |      |

| name  | varchar(25) | YES  |     | NULL   |       |

| deptid | int(11)     | YES |     | NULL    |      |

| salary | float       | YES |     | NULL    |      |

+--------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

 

4.删除主键约束

  ALTER TABLE <数据表名> DROP PRIMARY KEY;

(因为每个表的主键约束只有一个,所以并不用指定名称。)

实例5:删除tb_emp2表的主键约束

mysql> alter table tb_emp2 drop primary key;

Query OK, 0 rows affected (0.02 sec)

Records: 0 Duplicates: 0  Warnings: 0

 

mysql> desc tb_emp2;

+--------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| id    | int(11)     | NO   |    | 0       |       |

| name  | varchar(25) | YES  |     | NULL   |       |

| deptid | int(11)     | YES |     | NULL    |      |

| salary | float       | YES |     | NULL    |      |

+--------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
|
XML 关系型数据库 MySQL
【MySQL异常】ExecutorException: Error getting generated key or setting result to parameter object
【MySQL异常】ExecutorException: Error getting generated key or setting result to parameter object
476 0
|
5月前
|
关系型数据库 MySQL 数据库
Mysqlbug-Could not create or access the registry key needed for the MySQL applicationto, TIMESTAMP w
Mysqlbug-Could not create or access the registry key needed for the MySQL applicationto, TIMESTAMP w
|
关系型数据库 MySQL 数据库
连接MySQL时报错:Public Key Retrieval is not allowed的解决方法
连接MySQL时报错:Public Key Retrieval is not allowed的解决方法
701 1
|
7月前
|
关系型数据库 MySQL 数据库
MySQL8报错:Public Key Retrieval is not allowed
MySQL8报错:Public Key Retrieval is not allowed
3469 1
|
7月前
|
关系型数据库 MySQL
MySQL创建表出现 Specified key was too long; max key length is 767 bytes
MySQL创建表出现 Specified key was too long; max key length is 767 bytes
143 2
|
关系型数据库 MySQL
Mysql 主键冲突(ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY')
Mysql 主键冲突(ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY')
1250 0
|
7月前
|
关系型数据库 MySQL 数据库
Specified key was too long; max key length is 767 bytes导入mysql数据库表报错
Specified key was too long; max key length is 767 bytes导入mysql数据库表报错
187 0
|
关系型数据库 MySQL
零基础带你学习MySQL—foreign key 外键(二十六)
零基础带你学习MySQL—foreign key 外键(二十六)
|
关系型数据库 MySQL
零基础带你学习MySQL—primary key主键(二十三)
零基础带你学习MySQL—primary key主键(二十三)