【MySQL】表的约束(二)

news2024/11/16 11:55:01

文章目录

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

一. 主键

主键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=utf8

mysql> 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.coloradmin.cn/o/1060523.html

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

相关文章

Spring Cloud Zuul 基本原理

Spring Cloud Zuul 底层是基于Servlet实现的&#xff0c;核心是通过一系列的ZuulFilter来完成请求的转发。 1、核心组件注册 1.1. EnableZuulProxy注解 启用Zuul作为微服务网关&#xff0c;需要在Application应用类加上EnableZuulProxy注解&#xff0c;而该注解核心是利用Im…

国庆假期day5

作业&#xff1a;请写出七层模型及每一层的功能&#xff0c;请绘制三次握手四次挥手的流程图 1.OSI七层模型&#xff1a; 应用层--------提供函 表示层--------表密缩 会话层--------会话 传输层--------进程的接收和发送 网络层--------寻主机 数据链路层----相邻节点的可靠传…

Qt+openCV学习笔记(十六)Qt6.6.0rc+openCV4.8.1+emsdk3.1.37编译静态库

前言&#xff1a; 有段时间没来写文章了&#xff0c;趁编译库的空闲&#xff0c;再写一篇记录文档 WebAssembly的发展逐渐成熟&#xff0c;即便不了解相关技术&#xff0c;web前端也在不经意中使用了相关技术的库&#xff0c;本篇文档记录下如何编译WebAssembly版本的openCV&…

TouchGFX之文本和字体

TouchGFX可将动态值作为文本的一部分来使用。 这可以通过在文本中使用通配符来实现。 按给定格式<*>指定通配符&#xff0c;其中的*表示不会包含在结果文本中的可选辅助文本。 一个文本中可以有至多2个通配符。 在TouchGFX 设计器中&#xff0c;只需单击“”按钮为所选文…

Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)

Leetcode1071. 字符串的最大公因子 对于字符串 s 和 t&#xff0c;只有在 s t … t&#xff08;t 自身连接 1 次或多次&#xff09;时&#xff0c;我们才认定 “t 能除尽 s”。 给定两个字符串 str1 和 str2 。返回 最长字符串 x&#xff0c;要求满足 x 能除尽 str1 且 x 能…

g(x)=abx形式的函数最小二乘法计算方法

设函数&#xff0c;利用最小二乘法求解系数a和b: 设&#xff0c;&#xff0c;有 用最小二乘法求解和后&#xff0c;可得和&#xff1a; &#xff0c;

[Spring] Spring5——AOP 简介

目录 一、AOP 简介 1、什么是 AOP 二、AOP 底层原理 1、动态代理原理 2、基于接口的 JDK 动态代理 3、基于继承的 CGLib 动态代理 三、底层原理实现—— JDK 动态代理 1、使用 Proxy 类的方法创建代理对象 2、JDK 动态代理示例 四、AOP 操作术语 1、连接点 2、切入…

【算法学习】-【双指针】-【快乐数】

LeetCode原题链接&#xff1a;202. 快乐数 下面是题目描述&#xff1a; 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果…

408计网应用层总结

网络应用模型 ■客户/服务器模型&#xff08;C/S&#xff09;&#xff1a;客户是服务请求方&#xff0c;服务器是服务提供方 ■P2P模型&#xff1a;各主机都是客户&#xff0c;也都是服务器&#xff08;任意一对计算机成称为对等方&#xff09; 注&#xff1a; 1.客户…

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

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

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高性能服务器编程 学习笔记 第十章 信号

信号是由用户、系统、进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。Linux信号可由以下条件产生&#xff1a; 1.对于前台进程&#xff0c;用户可通过输入特殊终端字符来给它发送信号&#xff0c;如输入CtrlC通常会给进程发送一个中断信号。 2…

最短路径专题5 最短路径

题目&#xff1a; 样例&#xff1a; 输入 4 5 0 2 0 1 2 0 2 5 0 3 1 1 2 2 3 2 2 输出 3 0->3->2 思路&#xff1a; 根据题目意思&#xff0c;求最短路&#xff0c;这个根据平时的Dijkstra&#xff08;堆优化&#xff09;即可&#xff0c;关键在于求路径的方法&#x…

阿里云新账户什么意思?老用户、产品首购详细说明

阿里云新账户、老账号、产品首购和同人账号什么意思&#xff1f;阿里云账号分为云新账户、老账户、产品首购、同人账号和同一用户&#xff0c;阿里云官方推出的活动很多是限制账号类型的&#xff0c;常见的如阿里云新用户&#xff0c;什么是阿里云新用户&#xff1f;是指从未在…

mysql面试题11:讲一讲MySQL主从复制模式

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲MySQL主从复制模式? MySQL主从复制的配置步骤如下: 在主服务器上配置: 打开主服务器的配置文件my.cnf,启用二进制日志(binary log)功…

【Linux】[gdb]Linux环境下如何调试代码

一、code.c文件 我们首先创建一个code.c文件&#xff0c;写一段简单代码&#xff0c;用于测试。 二、makefile文件 然后&#xff0c;我们可以编写makefile文件&#xff0c;使得code.c文件能够进行编译。&#xff08;当然也可以不写makefile文件&#xff0c;直接对code.c进行编…

mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是全同步复制?底层实现? MySQL中的全同步复制(Synchronous Replication)是一种复制模式,主服务器在写操作完成后,必须等待…

PG 多表连接查询

写法&#xff1a; 使用 select 表名.键名 from 表1 join表2 on 相同的主键 构造出来一张新表 多表要用表名.键名 才能知道是哪一张表 传统写法也行 类型&#xff1a; 内 而外的要这样写

[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.…

虚拟机VMware的使用流程以及出现的问题附解决方法

虚拟机VMware的使用流程以及出现的问题附解决方法 下载安装 略。。。 创建虚拟机 虚拟机的设置如下&#xff1a;注意网络适配器为NAT 如果出现ip addr 命令&#xff1a;不显示IP地址的话&#xff1a; 解决方式如下&#xff1a; 首先设置网卡&#xff1a;先查看一下onboot是…