【MySQL入门指南】主键与唯一键的使用与区别

news2024/11/24 16:57:50

文章目录

    • 一、主键
        • 1.基本语法
        • 2.使用案例
    • 二、唯一键
        • 1.基本语法
        • 2.使用案例

一、主键

1.基本语法

-- 方式一
create table t5(id int primary key, ……); -- 设置id字段主键

-- 方式二
create table t5(
    id int primary key,
    ……
  	primary key(id, ……);  
    -- 每个表只能有一个主键,但是可以将多个列设置复合主键
)

​ 一张表中最多只能有一个主键,且主键约束的字段不能重复,不能为空。主键所在的列通常是整数类型。

mysql> show create table t5\G
*************************** 1. row ***************************
Create Table: CREATE TABLE `t5` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

​ 虽然我们在创建t5的时候没有设置id字段的非空约束,但是mysql在做语法优化的时候,会自动为主键字段加上 not null 的约束。

2.使用案例

  • 创建表的时候指定主键

    mysql> create table t7(
        -> id int unsigned primary key comment '将学号设置为主键',
        -> name varchar(10) not null);
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> desc t7;
    +-------+------------------+------+-----+---------+-------+
    | Field | Type             | Null | Key | Default | Extra |
    +-------+------------------+------+-----+---------+-------+
    | id    | int(10) unsigned | NO   | PRI | NULL    |       |
    | name  | varchar(10)      | NO   |     | NULL    |       |
    +-------+------------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
  • 删除主键

    alter table 表名 drop primary key
    

    image-20230427191932180

  • 当表创建好后没有主键,可以再次追加主键。如果即将设为主键的字段中存在重复,那么插入会失败。因此强烈建议在建表时就要考虑周到,后面再添加很不方便

    alter table 表名 add primary key(字段)
    

    image-20230427192021112

  • 主键约束的字段不能重复,一旦重复,则插入操作失败

    mysql> insert into t7 values(1, '张三');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t7 values(2, '李四');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t7 values(2, '王五');
    ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
    
  • 设置复合主键。在建表的时候,我们可以在所有字段后,使用 primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以设置为复合主键

    mysql> create table t8(
        -> id int,
        -> QQ varchar(20),
        -> telephone varchar(15),
        -> primary key(id, QQ, telephone)
        -> );
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> desc t8;
    +-----------+-------------+------+-----+---------+-------+
    | Field     | Type        | Null | Key | Default | Extra |
    +-----------+-------------+------+-----+---------+-------+
    | id        | int(11)     | NO   | PRI | NULL    |       |
    | QQ        | varchar(20) | NO   | PRI | NULL    |       |
    | telephone | varchar(15) | NO   | PRI | NULL    |       |
    +-----------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    

​ 在上面的这个例子中,id、QQ、telephone三个字段合并成为一个主键。复合主键的唯一性要求是,一个数据行中复合主键所有字段的组合必须唯一,也就是说它允许局部重复的出现。

二、唯一键

1.基本语法

mysql> create table t9(
    -> id int unsigned primary key auto_increment,
    -> QQ varchar(20) unique  -- unique关键字用于指定唯一键
    -> );

​ 前面谈到,主键可以保证数据的唯一性,但是一张表中主键只能有一个。然而在现实生活中,一张表中具有唯一性的数据往往不只一个,例如:身份证号、QQ号、手机号……那么这些数据的唯一性就需要由唯一键来保证。

​ 唯一键和主键的主要区别是:唯一键可以允许空值(NULL),其中空字段不做唯一性比较。空值的存在,就导致了唯一键并不能完全唯一地标识每一行数据;而主键不允许数据重复也不允许为空,因而可以唯一的标识每一行数据。

​ 我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,数据不要出现重复。一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整 。

2.使用案例

  • 设置QQ字段为唯一键

    mysql> create table t10(
        -> id int primary key auto_increment,
        -> name varchar(10) not null,
        -> QQ varchar(20) unique
        -> );
    Query OK, 0 rows affected (0.03 sec)
    

    image-20230428112518030

  • 唯一键不允许重复

    mysql> insert into t10 values(1, '张三', '123456');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t10 values(2, '李四', '123456');
    ERROR 1062 (23000): Duplicate entry '123456' for key 'QQ'
    
  • 唯一键允许为空

    mysql> insert into t10(name) values('李四');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t10;
    +----+--------+--------+
    | id | name   | QQ     |
    +----+--------+--------+
    |  1 | 张三   | 123456 |
    |  2 | 李四   | NULL   |
    +----+--------+--------+
    2 rows in set (0.00 sec)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商城订单模块实战 - 分库分表实战及海量数据处理

商城订单服务的实现 数据量 在设计系统,我们预估订单的数量每个月订单2000W,一年的订单数可达2.4亿。而每条订单的大小大致为1KB,按照我们在MySQL中学习到的知识,为了让B树的高度控制在一定范围,保证查询的性能&…

归一化层(BatchNorm、LayerNorm、InstanceNorm、GroupNorm)

参考博客 BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结 PyTorch学习之归一化层(BatchNorm、LayerNorm、InstanceNorm、GroupNorm) BN,LN,IN,GN从学术化上解释差异&#xf…

前端常见报错问题处理及技术点收集

一、报错问题收集 1、页面停留半小时左右不动卡死报错问题 Uncaught (in promise) TypeError: Failed to fetch dynamically imported module: http://10.233.54.161/assets/index.f8110bbc.js Promise.then (async) E main.c19f562f.js:39 f main.c19f562f.js:39 z.onClick…

Chatgpt聊天机器人系统开发

智能聊天ChatGPT的主要功能包括: 对话生成:生成连贯、自然的对话回复,与用户进行自然而流畅的对话。 意图识别:识别用户的意图和需求,并提供相应的回复或建议。 语义理解:理解用户的语言表达&a…

网络设备正常运行时间监控

什么是正常运行时间监控 正常运行时间是衡量服务器或任何网络组件对其最终用户的可用性的指标。定期检查网络设备可用性的过程称为正常运行时间监控。正常运行时间监控有助于确保所有组件保持正常运行,而不会停机。 正常运行时间监控是关键的网络监控功能&#xf…

Docker基础知识全解析

​ Docker是一个开源的容器化平台,可以让开发者在容器中构建、打包、运行和发布应用程序,从而实现应用程序的快速部署和可移植性。Docker将应用程序和依赖项打包在一个轻量级的可移植容器中,这个容器可以在任何平台上运行,不会受到…

Java 创建线程池的三种方式

一、 Java 创建线程池主要有以下三种方式 1. 默认线程池 ForkJoinPool 2. 通过调用执行器 Executors中的静态方法 3. 通过 ThreadPoolExector import java.util.concurrent.*;// 自定义线程工厂 class MyThreadFactory implements ThreadFactory {Override//ThreadFactory 主要…

从零开始学习Linux运维,成为IT领域翘楚(一)

文章目录 🔥Linux概述🔥Linux下载安装🔥Linux三种网络配置🔥Linux 远程登录 🔥Linux概述 Linux内核最初只是由芬兰人林纳斯托瓦兹1991年在赫尔辛基大学上学时出于个人爱好而编写的。 Linux特点 首先Linux作为自由软件…

递归实现指数型枚举

77. 组合 方法&#xff1a;递归 class Solution { private:vector<vector<int>> res;vector<int> path;void solve(int n, int k, int idx) {if (path.size() k) {res.push_back(path);return ;}for (int i idx; i < n - (k-path.size()) 1; i) {pat…

java 自定义Annotation注解

目录 1.声明注解 注解声明为interface&#xff08;注&#xff1a;这与interface接口没有任何关系&#xff09; 内部定义成员通常用value表示 使用 可以指定成员的默认值&#xff0c;使用default定义 介绍 2.JDK中的元注解 Retention&#xff1a; Target&#xff1a; …

用于高负载多站点网络的 WordPress Multisite Cron

在易服客建站平台创建免费网站 500M免费空间&#xff0c;可升级为10GB电子商务网站 创建免费网站 用于高负载多站点网络的 WordPress Multisite Cron 发布于 2023年3月18日 你也许知道WordPress 内置 CRON 的工作方式与传统 CRON 不同。 它不是在指定时间触发&#xff0c…

辨析 变更请求、批准的变更请求、实施批准的变更请求

变更请求、批准的变更请求、实施批准的变更请求辨析 辨析各种变更请求&#xff0c;不服来辨。 变更请求 定义&#xff1a;对正规受控的文件或计划(范围、进度、成本、政策、过程、计划或程序)等的变更&#xff0c;以反映修改或增加的意见或内容 根据变更请求的工作内容可将变…

python-使用Qchart总结3-绘制曲线图

1.将画好的图表关联 解释说明图 2.新建一个文件画曲线图&#xff0c;并关联到UI的py文件上&#xff0c;上代码 import sys from PyQt5.Qt import * from PyQt5.QtChart import QChartView, QChart, QValueAxis, QSplineSeries from PyQt5.QtGui import QPainter, QColor, QFon…

PHP实现使用foreach、for等语句实现数组遍历的功能举例

目录 前言 一、什么是数组 二、遍历数组for语句案例 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 三、输出数组的键名和值,foreach语句案例 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 前言 1.若有选择&#xff0c;可实现…

二十三种设计模式第二篇--工厂模式

上篇我们了解了6条设计模式的准则&#xff0c;我相信如果你想了解设计模式&#xff0c;那么你迈出的第一步&#xff0c;我会将上一篇文档里边的6大准则进行一篇有关的代码展示&#xff0c;当然这是题外话了&#xff0c;本篇我们将重点围绕工厂模式进行讲解&#xff0c;天哪&…

Shell+VCS学习1

Shell脚本常见问题 mkdir rmdir rm mkdir 创建文件夹 mkdir -p filename-p 确保目录名称存在&#xff0c;不存在的就建一个。 mkdir -p runoob2/test若 runoob2 目录原本不存在&#xff0c;则建立一个。&#xff08;注&#xff1a;本例若不加 -p 参数&#xff0c;且原本 ru…

【C++】反向迭代器的实现

文章目录 1.迭代器的分类2.反向迭代器的使用3.反向迭代器的模拟实现4.list类的反向迭代器实现 1.迭代器的分类 我们随便打开一个容器&#xff0c;看迭代器相关的接口&#xff0c;都可以发现&#xff0c;支持迭代器的容器&#xff0c;其迭代器有以下几类 正向迭代器const正向迭…

软件测试必备的Linux知识(一)

1. Linux 概述 1.1 测试人员为什么学习linux 对于软件测试人员来说&#xff0c;我们测试的任何产品都是基于操作系统。比如我们每天都在使用的QQ软件&#xff0c;它有windows、ios、Android、Mac OS等版本&#xff0c;需要把QQ安装在各个平台上&#xff0c;才能进行相应的测试…

03 KVM虚拟机镜像制作

文章目录 03 KVM虚拟机镜像制作3.1 概述3.2 制作镜像3.2.1 使用root用户安装qemu-img软件包3.2.2 使用qemu-img工具的创建镜像文件 3.3 修改镜像磁盘空间大小3.3.1 查询当前虚拟机镜像磁盘空间大小3.3.2 修改镜像磁盘空间大小3.3.3 查询修改后的镜像磁盘空间大小 03 KVM虚拟机镜…

WPS作图常见问题+LATLEX

【LaTex】LaTex的下载与安装&#xff08;超详细、超简洁&#xff09; 表格 1、打开WPS表格&#xff0c;切换至“开始”选项卡&#xff0c;单击“绘图边框”按钮&#xff0c;如下图。 2、鼠标变成如下图一样的笔后&#xff0c;按照斜线表头的方向拉动鼠标&#xff0c;然后就给…