【MySQL】表的约束(二)

文章目录

  • 一. 主键
  • 二. 自增长
  • 三. 唯一值
  • 四. 外键
  • 结束语

一. 主键

主键primary key
用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表最多只能有一个主键,主键所在的列通常是整数类型

  • 创建表时直接在字段上指定主键
mysql> create table student(-> id int primary key comment '学生id,唯一且非空',-> name varchar(6)-> );mysql> desc student;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI | NULL    |       |   <= key中显示PRI
| name  | varchar(6) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
  • 主键约束:非空且唯一
mysql> insert into student values (1,'张三');
Query OK, 1 row affected (0.00 sec)mysql> insert into student values (1,'李四');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
  • 可以在建表后追加主键

alter table 表名 add primary key(属性名);

  • 删除主键

alter table 表名 drop primary key;


  • 复合主键
    虽然一张表只能有一个主键,但是一个主键可以是多个属性
mysql> create table student(-> id int,-> name varchar(6),-> primary key(id,name)  //id和name的复合主键-> );mysql> desc student;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI | NULL    |       |
| name  | varchar(6) | NO   | PRI | NULL    |       |
+-------+------------+------+-----+---------+-------+

如此,id和name都不允许为空,且不能重复(两个都相同才算重复)

二. 自增长

auto_increment:当对应的字段不显示赋值时,系统会赋值为当前字段中已经有的最大值+1。通常和主键搭配使用

自增长的特点:

  • 任何一个字段是自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
mysql> create table student(-> id int unsigned primary key auto_increment,-> name varchar(6)-> );mysql> show create table student \G;
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(6) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mysql> insert into student (name) values ('张三');
mysql> insert into student (name) values ('李四');
mysql> insert into student (name) values ('王五');mysql> select * from student;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
|  3 | 王五   |
+----+--------+mysql> show create table student \G;
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(6) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

创建表时,如果没有指定自增长的起始值,默认为1
每次插入数据后,MySQL会保存当前自增长属性的最大值+1,供下次插入使用

如果此时插入一个id=500的,那么MySQL保存的就是501

mysql> insert into student (id,name) values (500,'赵六');mysql> show create table student \G;
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(6) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=501 DEFAULT CHARSET=utf8
  • 建表时还可以指定auto_increment的起始值
mysql> create table student(-> id int unsigned primary key auto_increment,-> name varchar(6)-> )auto_increment=500;  //指定自增长的起始值

三. 唯一值

一张表往往有很多字段需要唯一性,数据不能重复,但是一张表只能有一个主键;唯一键就可以解决表中多个字段需要唯一性约束的问题

唯一键和主键本质差不多,唯一键允许为空,而且可以多个为空,空字段不作唯一性比较

应用场景:

员工号和身份证。员工号作主键不允许为空且唯一,但身份证同样不允许重复,但又不能和员工号组成复合主键,所以可以使用唯一键


mysql> create table worker(-> id int unsigned primary key auto_increment comment '员工工号',-> telephone int unique comment '员工电话号',-> name varchar(6) comment '员工姓名'-> );mysql> insert into worker (telephone,name) values (123456,'张三');
mysql> insert into worker (telephone,name) values (123456,'李四');
ERROR 1062 (23000): Duplicate entry '123456' for key 'telephone'mysql> insert into worker (telephone,name) values (NULL,'李四');
mysql> insert into worker (telephone,name) values (NULL,'王五');mysql> select * from worker;
+----+-----------+--------+
| id | telephone | name   |
+----+-----------+--------+
|  1 |    123456 | 张三   |
|  3 |      NULL | 李四   |
|  4 |      NULL | 王五   |
+----+-----------+--------+

四. 外键

外键用于定义主表和从表之间的关系;外键约束主要定义在从表上,主表则必须有主键约束或唯一键约束。当定义外键后,要求外键列数据必须在主表中存在或为NULL

foreign key(字段名) references 主表(字段名)

案例:
在这里插入图片描述

如此,课程表为主表,学生表为从表

mysql> create table course(-> id int unsigned primary key,-> name varchar(6)-> );
mysql> create table student( ->id int unsigned primary key,->name varchar(6),->class_id int unsigned,->foreign key (class_id) references coursse(id)->);

注意点:

  • 不允许在从表的外键中插入不存在于主表的数据
  • 主表对应外键,在从表中有数据时,不允许删除该外键
mysql> insert into course values (001,'高数课');
Query OK, 1 row affected (0.00 sec)mysql> insert into student values (100,'张三',001);
Query OK, 1 row affected (0.00 sec)//不允许在从表的外键中插入不存在于主表的数据
mysql> insert into student values (200,'李四',002);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint 
fails (`test_demo`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) 
REFERENCES `course` (`id`))
//主表对应外键,在从表中有数据时,不允许删除该外键
mysql> delete from table course where id=001;
ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use
near 'table course where id=001' at line 1

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化学习环境 - robogym - 学习 - 1

强化学习环境 - robogym - 学习 - 1 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机械臂 table-top 级的多任务操作 robogym 基于 mujoco 搭建&#xff0c;构建了一个仿真机械臂桌面物体操作&#xff08;pick-place、stack、rearr…

修改npm全局安装的插件(下载目录指向)

我们先打开终端 然后执行 npm config get prefix查看npm 的下载地址 一般都会在C盘 但是 我们都知道 C盘下东西多了是很不好的 所以 我们可以执行 npm config set prefix “E:\npmfile”将 npm 的下载地址 改变成 E盘下的 npmfile目录 这样 以后 默认全局安装的插件就会都到…

计算机网络基础(一):网络系统概述、OSI七层模型、TCP/IP协议及数据传输

通信&#xff0c;在古代是通过书信与他人互通信息的意思。 今天&#xff0c;“通信”这个词的外沿已经得到了极大扩展&#xff0c;它目前的大意是指双方或多方借助某种媒介实现信息互通的行为。 如果按照当代汉语的方式理解“通信”&#xff0c;那么古代的互遣使节、飞鸽传书…

2023版 STM32实战5 基本定时器中断

基本定时器简介与特性 -1-时钟可分频 -2-计数模式只可以选择累加 -3-只可以用来定时&#xff08;含中断&#xff09; 查看时钟源 如图定时器7的时钟最大为72MHZ 定时时间的计算 通用定时器的时间计算公式为 Tout &#xff08;&#xff08;arr1&#xff09;&#xff08;psc1&…

Eureka

大家好我是苏麟今天带来Eureka的使用 . 提供者和消费者 在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务…

【11】c++设计模式——>单例模式

单例模式是什么 在一个项目中&#xff0c;全局范围内&#xff0c;某个类的实例有且仅有一个&#xff08;只能new一次&#xff09;&#xff0c;通过这个唯一的实例向其他模块提供数据的全局访问&#xff0c;这种模式就叫单例模式。单例模式的典型应用就是任务队列。 为什么要使…

剑指offer——JZ18 删除链表的节点 解题思路与具体代码【C++】

一、题目描述与要求 删除链表的节点_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。 1.此题对比原题有改动 2.题目保证链表中节点的值互不相同 3.该题只会输出返回…

SQL Server不允许保存更改的解决方法

SQL Server不允许保存更改的解决方法

Nginx高级 第一部分:扩容

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

window安装压缩版postgresql

环境&#xff1a; window 11 专业版postgresql-16.0-1-windows-x64-binaries.zip 一、下载 1.1 从官网下载 https://www.postgresql.org/download/windows/ 1.2 从百度网盘下载 链接&#xff1a;https://pan.baidu.com/s/1fmQbgWSzX4hN07Lgdzfz0g?pwddzyy 提取码&#…

竞赛选题 机器视觉人体跌倒检测系统 - opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器视觉人体跌倒检测系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&…

DevEco Studio设置Nodejs提示路径只能包含英文、数字、下划线等

安装DevEco Studio 3.1.1 Release 设置Nodejs路径使用nodejs默认安装路径 &#xff08;C:\Program Files\nodejs&#xff09; 提示只能包含英文、数字、下划线等 , 不想在安装nodejs请往下看 nodejs默认路径报错 修改配置文件 1、退出DevEco Studio 2、打开配置文件 cmd控制台…

linux入门---信号的保存和捕捉

目录标题 信号的一些概念信号的保存pending表block表handler表 信号的捕捉内核态和用户态信号的捕捉 信号的一些概念 1.进程会收到各种各样的信号&#xff0c;那么程序对该信号进行实际处理的动作叫做信号的递达。 2.我们之前说过当进程收到信号的时候可能并不会立即处理这个信…

[BJDCTF2020]Mark loves cat

先用dirsearch扫一下&#xff0c;访问一下没有什么 需要设置线程 dirsearch -u http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn:81/ --timeout2 -t 1 -x 400,403,404,500,503,429使用githack python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.…

@Slf4j注解的使用说明

Slf4j的作用 该注解的作用主要是操作在idea中的控制台中打印的日志信息。 等价于代码&#xff1a; private final Logger logger LoggerFactory.getLogger(当前类名.class); 使用指定类初始化日志对象&#xff0c;在日志输出的时候&#xff0c;可以打印出日志信息所在类 当…

程序在线报刊第一期

文章目录 程序在线报刊第一期排序算法&#xff1a;优化数据处理效率的核心技术回顾区块链技术&#xff1a;去中心化引领数字经济新时代展望AI未来&#xff1a;智能化时代的无限可能 程序在线报刊第一期 排序算法&#xff1a;优化数据处理效率的核心技术 近年来&#xff0c;随…

软件设计师_计算机网络_学习笔记

文章目录 4.1 网路技术标准与协议4.1.1 协议4.1.2 DHCP4.1.3 DNS的两种查询方式 4.2 计算机网络的分类4.2.1 拓扑结构 4.3 网络规划与设计4.3.1 遵循的原则4.3.2 逻辑网络设计4.3.3 物理网络设计4.3.4 分层设计 4.4 IP地址与子网划分4.4.1 子网划分4.4.2 特殊IP 4.5 HTML4.6 无…

ReactNative学习笔记

文章目录 基础环境搭建创建项目安装vscode插件调试工具基础语法掌握ReactStyleSheetRN中的样式和CSS的不同通过style属性直接声明在style属性中调用StyleSheet声明的样式 Flexbox术语属性响应式布局 组件和API简介核心组件**最常用的一些核心组件**各核心组件的演示代码Alert和…

MyBatisPlus(八)范围查询

说明 范围查询&#xff0c;包括&#xff1a; 大于大于等于小于小于等于在范围内在范围外 大于&#xff1a;gt 代码 Testvoid gt() {LambdaQueryWrapper<User> wrapper new LambdaQueryWrapper<>();wrapper.gt(User::getAge, 20);List<User> users mapp…

QT实现TCP服务器客户端的实现

ser&#xff1a; widget.cpp&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xf…