mysql:表的约束(空属性,默认值,comment,zerofill,主键,唯一键,外键)

devtools/2024/9/19 19:26:23/ 标签: 数据库

目录

表的约束

空属性

默认值(defualut)

comment:列描述

zerofill :显示约束

主键

自增长:auto_increment

唯一键

外键

查询数据


表的约束

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。

表的约束有很多,这里主要介绍如下几个:null/ not null,default,comment,zerofill.primary, key,auto_increment,unique key.

 表的约束:表中一定要有各种约束,让我们未来插入数据是符符合预期的,约束本质是通过技术手段,逼迫程序员,插入正确数据。反过来,站在MySQL的视角,凡是插入进来的数据,都是符合数据约束的。

约束的最终的目标:保证数据的完整性和可预期性。

空属性

两个值:null(默认的)和not null(不为空)

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。 

默认值(defualut)

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就制定好,在需要真实数据的时候,用户可以选择性的使用默认值。   

create table if not exists t13 (name varchar(20) not null,age tinyint unsigned default 18,gender char(1) default '男'
);

comment:列描述

没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或dba来继续了解。

create table if not exists t14 (name varchar(20) not null, comment "这是用户姓名"age tinyint unsigned default 18,  comment"这是用户年龄"gender char(1) default '男'        comment"这是用户性别"
);

我们可以采用show create table (表的名字)来查看描述的字段。

zerofill :显示约束

在 MySQL 中,ZEROFILL 是一种用于数字列的属性,它会在数字前面填充零,以确保列的显示宽度达到指定的长度。这在处理数字时可以使输出更整齐,尤其是在需要对齐数字的情况下。

假设我们有一个表 products,我们希望存储产品的 ID,并且希望这些 ID 在输出时总是显示为 5 位数,不足的部分用零填充。

CREATE TABLE products (product_id INT(5) ZEROFILL,product_name VARCHAR(50)
);

在这个例子中,product_id 列被定义为 INT(5) ZEROFILL,这意味着它的显示宽度为 5 位,不足的部分会用零填充。

复制下载

INSERT INTO products (product_id, product_name) VALUES (1, 'Product A');
INSERT INTO products (product_id, product_name) VALUES (23, 'Product B');
INSERT INTO products (product_id, product_name) VALUES (456, 'Product C');
INSERT INTO products (product_id, product_name) VALUES (7890, 'Product D');
SELECT product_id, product_name FROM products;

输出结果

+------------+-------------+
| product_id | product_name|
+------------+-------------+
| 00001      | Product A   |
| 00023      | Product B   |
| 00456      | Product C   |
| 07890      | Product D   |
+------------+-------------+
  • 在查询结果中,product_id 列的值总是显示为 5 位数,不足的部分用零填充。
  • 例如,1 被显示为 0000123 被显示为 00023,依此类推。
  • ZEROFILL 只影响显示,不会改变存储的实际值。
  • 如果你在 SELECT 查询中使用 CAST 或 CONVERT 函数,可能会影响 ZEROFILL 的效果。

ZEROFILL 是一个有用的属性,可以帮助你在数据库中以一致的格式显示数字,尤其是在需要对齐和格式化输出时。

主键

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

create table if not exists test_key(id int unsigned primary key comment '这是学生的学号',name varchar(20) not null);

当我们插入数据的时候,对应的id内的整数不能重复。反正插入的数据一定是不冲突的。

当表创建好以后但是没有主键的时候,我们可以追加主键。

alter table 表名 add primary key(字段列表)

删除主键

alter table 表名 drop primary key;

复合主键:一个主键可以被添加一列,或者多列上。

CREATE TABLE enrollments (student_id INT NOT NULL,course_id INT NOT NULL,enrollment_date DATE,PRIMARY KEY (student_id, course_id)
);

自增长:auto_increment

auto_increment:当对应字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

任何一个字段要做自增长,前提是本身是一个索引。

自增长字段必须是整数。

一张表最多只能有一个自增长。

CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL
);

插入数据

INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com');
INSERT INTO users (username, email) VALUES ('bob', 'bob@example.com');
INSERT INTO users (username, email) VALUES ('charlie', 'charlie@example.com');

查询数据

SELECT * FROM users;

输出结果

+---------+----------+-------------------+
| user_id | username | email             |
+---------+----------+-------------------+
|       1 | alice    | alice@example.com |
|       2 | bob      | bob@example.com   |
|       3 | charlie  | charlie@example.com|
+---------+----------+-------------------+

特点

  • 在插入数据时,我们没有为 user_id 指定值,MySQL 自动为其分配了 1、2、3 等唯一值。
  • 如果我们再次插入新用户,user_id 会继续自动增长。

唯一键

唯一键(Unique Key)用于确保表中某一列或某几列的值是唯一的,防止重复数据的插入。下面是一个使用唯一键的示例。

假设我们要创建一个 users 表,用于存储用户信息。我们希望每个用户的电子邮件地址是唯一的。

CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE
);
  • user_id 列是自增长的主键。
  • username 列用于存储用户名。
  • email 列设置为 UNIQUE,这意味着每个用户的电子邮件地址必须是唯一的,不能重复。

插入数据

INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com');
INSERT INTO users (username, email) VALUES ('bob', 'bob@example.com');

尝试插入重复的电子邮件

INSERT INTO users (username, email) VALUES ('charlie', 'alice@example.com');

结果

在尝试插入重复的电子邮件时,数据库会返回错误,提示违反唯一约束。

查询数据

SELECT * FROM users;

输出结果

+---------+----------+-------------------+
| user_id | username | email             |
+---------+----------+-------------------+
|       1 | alice    | alice@example.com |
|       2 | bob      | bob@example.com   |
+---------+----------+-------------------+

特点

  • 在 email 列上设置唯一键后,任何尝试插入重复电子邮件的操作都会失败。
  • 唯一键可以用于确保数据的完整性,避免重复记录。

总结

唯一键是数据库设计中非常重要的一部分,确保特定列的值在表中是唯一的,有助于维护数据的完整性和一致性。

外键

外键用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表则必须是有主键约束或者unique约束。当定义外键 后,要求外键列数据必须在主表的主键列存在或为null。

语法:

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

当然可以!以下是使用小写字母的外键示例。

示例:学生和课程表

假设我们有两个表:students 表和 courses 表。我们希望在 enrollments 表中记录学生选修的课程,并使用外键来确保数据的完整性。

创建学生表

create table students (student_id int auto_increment primary key,student_name varchar(50) not null
);

创建课程表

create table courses (course_id int auto_increment primary key,course_name varchar(100) not null
);

创建选课表(带外键)

create table enrollments (enrollment_id int auto_increment primary key,student_id int,course_id int,enrollment_date date,foreign key (student_id) references students(student_id),foreign key (course_id) references courses(course_id)
);

解释

  • students 表存储学生信息,student_id 是主键。
  • courses 表存储课程信息,course_id 是主键。
  • enrollments 表记录学生选修的课程,student_id 和 course_id 列分别是外键,引用 students 表和 courses 表的主键。

插入数据

insert into students (student_name) values ('alice');
insert into students (student_name) values ('bob');insert into courses (course_name) values ('math');
insert into courses (course_name) values ('science');

插入选课数据

insert into enrollments (student_id, course_id, enrollment_date) values (1, 1, '2023-09-01');
insert into enrollments (student_id, course_id, enrollment_date) values (2, 2, '2023-09-02');

尝试插入无效的外键

insert into enrollments (student_id, course_id, enrollment_date) values (3, 1, '2023-09-03');

结果

在尝试插入无效的 student_id 时,数据库会返回错误,提示违反外键约束,因为 student_id 为 3 的学生并不存在于 students 表中。

查询数据

select * from enrollments;

输出结果

+----------------+------------+-----------+-----------------+
| enrollment_id  | student_id | course_id | enrollment_date |
+----------------+------------+-----------+-----------------+
|              1 |          1 |         1 |       2023-09-01|
|              2 |          2 |         2 |       2023-09-02|
+----------------+------------+-----------+-----------------+

特点

  • 外键约束确保 enrollments 表中的 student_id 和 course_id 必须在 students 和 courses 表中存在。
  • 这有助于维护数据的完整性,防止无效的引用。

总结

外键在数据库设计中非常重要,能够确保表之间的关系和数据的完整性。通过使用外键,可以有效地管理和维护数据之间的关联。


http://www.ppmy.cn/devtools/97202.html

相关文章

第22天笔记

C语言编译步骤 预处理 编译 汇编 链接 什么是预处理 预处理就是在源文件(如.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理 程序自动来完成;当源文件在编译时,编译器会自动调用预处理程…

[游戏开发] LuaTable转string存读二进制文件

UE5和Unity通用此方案,只不过读写文件的接口略有不同,lua代码的处理是相同的。 下面两个方法是 LuaTable和字符串互相转换的代码 function XUtils.luaTableToString(tab, sp)sp sp or ""local s ""for k,v in pairs(tab) doif t…

【网络安全】P2:访问控制失效

未经许可,不得转载。 文章目录 正文 正文 该漏洞允许我绕过电子邮件验证步骤,无需我点击发送到我的收件箱的链接。 某应用程序提示我,只有验证我的帐户才能使用网站上的一项功能。当我点击“开始验证”并拦截请求时,请求体如下&am…

关于鸿蒙开发中装饰器@Extend、@Styles、@Builder的介绍

总结 名称适合是否可以参数Extend抽取 特定组件 样式、事件√Styles抽取 公共 样式、事件Builder抽取 结构、样式、事件√ Extend 语法: Extend(要扩展的组件,例如Text、Column、Row等) function functionName { ... } 使用规则: 1、Ex…

WebMagic:强大的Java爬虫框架解析与实战

文章目录 引言官网链接WebMagic原理概述基础使用1. 添加依赖2. 编写PageProcessor 高级使用1. 自定义Pipeline2. 分布式抓取 优点结论 引言 在大数据时代,网络爬虫作为数据收集的重要工具,扮演着不可或缺的角色。Java作为一门广泛使用的编程语言&#x…

【分布式系统】关于主流的几款分布式链路追踪工具

Jaeger 标准化与兼容性: Jaeger 支持 OpenTracing 和 OpenTelemetry 标准,这意味着它可以与各种微服务架构和应用框架无缝集成,提供了广泛的兼容性和灵活性。 数据存储选项: Jaeger 支持多种数据存储后端,如 Cassandra…

内存泄漏之如何使用Visual Studio的调试工具跟踪内存泄漏?

使用Visual Studio的调试工具跟踪内存泄漏是一个系统性的过程,主要包括启用内存泄漏检测、运行程序、分析内存使用情况以及定位泄漏源等步骤。 Visual Studio提供了多种方式来检测内存泄漏,你可以根据自己的需求选择合适的方法。 注意:下面…

引领企业全球化发展 极光亮相华为亚太ICT峰会2024·泰国

近日,华为亚太ICT峰会2024泰国正式开幕,极光(Aurora Mobile,纳斯达克股票代码:JG)凭借其创新的技术实力与前瞻性的产品布局,受邀出席本次活动。会上,极光展示了其全域消息通知解决方…

MySQL——单表查询(二)按条件查询(11)OR 和 AND 关键字一起使用的情况

OR 关键字和 AND 关键字可以一起使用,需要注意的是,AND 的优先级高于 OR。因此当两者在一起使用时,应该先运算 AND 两边的条件表达式,再运算 OR两边的条件表达式。 例如,查询 student 表中 gender 字段值为 “ 女 ” 或…

C语言:链表删除

链表删除分为头删除和中间删除&#xff08;包含尾删除&#xff09;。 同时注意单向链表原则&#xff1a;先连后断。 具体方法如下&#xff1a; #include<stdio.h> #include<stdlib.h>typedef struct node {int s;struct node* pnext; }list;list* addnode(list*…

UART通信实现与验证(RS485)

前言 UART是一种常用的串行通信协议&#xff0c;RS485则是一种用于长距离和抗干扰的物理层标准。结合UART和RS485可以实现可靠的数据传输&#xff0c;特别是在多点通信和长距离应用中。通过合适的硬件连接、软件配置和验证测试&#xff0c;可以确保这一通信系统的稳定性和数据完…

thinkphp8 定时任务

在ThinkPHP8中创建定时任务通常涉及到Cron作业调度或者操作系统的定时任务功能&#xff08;如cronjob&#xff09;。以下是一个使用操作系统的cronjob的例子。 创建一个命令&#xff1a; // app/Command/ExampleCommand.php namespace app\Command;use think\console\Command; …

Vue 和 React 各自的背景和特点

Vue 的背景和特点 背景&#xff1a; Vue.js 由尤雨溪于2014年创建&#xff0c;并于同年发布第一个版本。Vue 的设计目标是简单、灵活&#xff0c;易于上手&#xff0c;具有响应式数据绑定和组件化开发的特性。 解决的问题&#xff1a; Vue 解决了构建交互式前端界面的问题&…

论文解读:LONGWRITER: UNLEASHING 10,000+ WORD GENERATION FROM LONG CONTEXT LLMS

摘要 现象&#xff1a;当前的大预言模型可以接受超过100,000个tokens的输入&#xff0c;但是却难以生成超过2000个token的输出。 原因&#xff1a;监督微调过程(SFT)中看到的样本没有足够长的样本。 解决方法&#xff1a; Agent Write&#xff0c;可以将长任务分解为子任务&a…

去抖音视频水印的软件免费推荐,精选四款实用工具助你轻松去除水印

随着抖音等短视频平台的流行&#xff0c;我们常常会遇到想要保存某些视频但不想保留水印的情况。本文将为您推荐四款去抖音视频水印的实用工具&#xff0c;帮助您轻松去除视频中的水印&#xff0c;保存清晰的内容。 工具一&#xff1a;奈斯水印助手(小程序) 推荐指数&#xf…

C语言——文件

文件操作 概念 文件是指存储在外存储器上&#xff08;一般代指磁盘&#xff0c;也可以是U盘&#xff0c;移动硬盘等&#xff09;的数据的集合。 文件操作体现在哪几个方面 1.文件内容的读取 2.文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&#xf…

Java中的安全编程实践:加密、解密与数字签名

在现代软件开发中&#xff0c;安全性是一个至关重要的方面。无论是保护用户数据&#xff0c;还是确保通信安全&#xff0c;了解和实施有效的安全措施都是开发者的必修课。本文将详细探讨Java中实现安全性的方法&#xff0c;主要包括加密、解密和数字签名&#xff0c;并提供相应…

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境&#xff0c;允许开发者在服务器端运行 JavaScript 代码。随着技术的发展&#xff0c;Node.js 不断推出新版本&#xff0c;引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南&#xff0c;帮…

内网拓扑可视化及管控技术

内网安全面临严峻威胁和管理挑战 在当今数字化时代&#xff0c;企业面临着日益复杂和多样化的网络安全威胁。云计算和移动设备的普及增加了网络边界的复杂性和模糊性&#xff0c;使传统的边界防护措施疲于应对更复杂的安全攻击手段。比如边界防护难以防止内部员工或恶意攻击者通…

Redis7基础篇(一)

redis十大数据类型 目录 redis十大数据类型 redis键key 数据类型命令 redis字符串string 分布式锁 ​编辑 ​编辑​编辑应用场景 ​编辑​编辑 reids列表list 应用场景 redis哈希hash 应用场景 redis集合set 应用场景 redis有序集合zset&#xff08;sorted set集…