MYSQL-约束

1-limit语句

limit的作用是限制查询记录的条数

格式如下

sql 复制代码
select * from 表名 limit  offset, row_count;

举例

select * from table limit 1, 4;

这里的1指的是从第二行数据开始,1就是索引(索引从0开始),4指的是查询记录条数,也就是从第二条(行)开始,一共查询四条记录,到第五条(行)

如果第一个参数是0的话,可以进行简写

eg:SELECT * FROM table LIMIT 0,5;

SELECT * FROM tableLIMIT 5;

2-数据库约束

1-作用

数据库的约束是指在数据库设计中, 为了确保数据的完整性,一致性和有效性而施加的条件。

2-常见的约束种类

主键约束(Primary Key Constraint):确保表中每一行数据的唯一性,主键列的值不能重复且不能为空。

外键约束(Foreign Key Constraint):用于确保在一个表中引用另一个表的主键时,引用的值必须存在,从而维护表之间的关系。

唯一约束(Unique Constraint):确保某列(或列组合)中的值是唯一的,可以为空,但如果有值则不能重复。

检查约束(Check Constraint):定义一个条件,只有满足该条件的数据才能被插入或更新到表中。

非空约束(Not Null Constraint):确保某列的值不能为空。

默认值约束(default):在没有给某列值的时候,为默认值

3-主键约束

1-主键的作用

用于唯一标识表中每一行数据。

保证每个主键值的唯一性,且不能为null,保证了数据的唯一性。

2-为什么要有主键约束

当某些记录的字段值一样的时候,会无法区分这些数据,导致数据库的记录不唯一,不方便管理数据。

注:每张表都应该有一个主键,但是每一个表也有且只能有一个主键。

3-通常作为主键的字段

通常使用不常用的字段,给每张表单独设计一个id字段,将id作为主键。

4-主键的特点

唯一性:主键值在整个表中必须唯一,确保没有两行数据有相同的主键值。

非空性:主键列不能包含NULL值,确保每一行都有一个有效的标识符。

索引:数据库通常会自动为主键创建索引,以提高查询效率。

表限制:每个表只能有一个主键,但主键可以由多个列组成。

5-创建主键的方式

1-在创建表的时候给字段添加主键

字段名 字段类型 PRIMIARY KEY

sql 复制代码
#举例,给idi字段添加一个主键
create table tb(
id int primary key,
name varchar(50),
age int,
gender varchar(2)
)

2-在已有表中添加主键

ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

sql 复制代码
#举例,给id字段添加一个主键
ALTER TABLE tb ADD PRIMARY KEY(id);

3-注意事项

如果一个字段已经添加了主键,注意:

1:不能插入重复的主键(主键的唯一性)。

2:插入的主键值不能为null(主键为非空)。

4-主键自增

如果让我们自己主动添加主键的时候,当数据很多的时候,很容易出错,于是我们希望当每次插入新的记录的时候,主键的值会实现自动增长。

1-具体操作

在创建表的时候添加在字段后面就可以

字段名 字段类型 PRIMARY KEY AUTO_INCREMENT

AUTO_INCREMENT表示的就是自动增长,注意自增必须是整数类型。

2-delete和truncate的区别

当使用delete删除表中的数据的时候,表中id的主键值并不会进行重置,比如原本的id主键值为4,当我们使用delete删除该表的数据后,然后向表中插入新的数据,会发现插入新的数据的主键值不是从1开始(默认的主键值为1),而是从5开始,
当使用truncate摧毁表的时候,主键的值会重置为1.

5-唯一约束

确保每个值都是唯一的,防止重复数据的录入

允许为空,当多个数据为null的时候,不算重复

在创建表格的时候, 字段名 字段类型 UNIQUE

举例如下

sql 复制代码
CREATE TABLE Users (
    UserID INT PRIMARY KEY,
    Email VARCHAR(255) UNIQUE,
    Username VARCHAR(50) UNIQUE,
    FullName VARCHAR(100)
);

6-非空约束

防止该列的值为空,保证数据的完整性

字段名 字段类型 NOT NULL

举例如下

sql 复制代码
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    Email VARCHAR(255) NOT NULL,
    HireDate DATE NOT NULL
);

还可以将UNIQUE 和 NOT NULL组合起来,唯一并且非空

7-默认值

向表中添加数据的时候,如果不指定字段的数据的时候,就会使用默认值,保证数据的完整性

格式 字段名 字段类型 DEFAULT 默认值

举例如下

sql 复制代码
CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName VARCHAR(100) NOT NULL,
    Price DECIMAL(10, 2) DEFAULT 0.00,
    CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP
);

8-表关系和外键约束

表的关系是数据库中不同表之间如何相互关联的方式,主要有三种类型:一对一、一对多和多对多。

主要类型:

1-一对一关系:

每个表中的每条记录仅对应另一个表中的一条记录。例如,一个用户只有一个唯一的地址。

这种关系在开发中并不常用,所以稍作了解就可以了

可以在任意一方的表中添加另外一方的主键作为外键即可。

原理如下

2-一对多关系:

一个表中的一条记录可以对应另一个表中的多条记录。比如,一个客户可以有多个订单

需要在多的一方增加一列,引入一的一方的主键作为自己的外键

具体演示如图所示

3-多对多关系:

两个表中的记录可以互相对应多条记录。这通常通过一个关联表实现,例如学生和课程的关系,学生可以选修多门课程,而每门课程也可以有多个学生。

这个关联表会使用这两个表的主键作为关联表的外键。

举例

sql 复制代码
#创建主要表格
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    StudentName VARCHAR(100)
);
CREATE TABLE Courses (
    CourseID INT PRIMARY KEY,
    CourseName VARCHAR(100)
);
#创建关联表格
CREATE TABLE Enrollments (
    StudentID INT,
    CourseID INT,
    PRIMARY KEY (StudentID, CourseID),
    FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
    FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
/*这段 SQL 代码用于创建一个名为 Enrollments 的表,具体含义如下:

表名:Enrollments,表示学生选课的记录。

字段:

StudentID INT:定义了一个整型字段,存储学生的唯一标识符。
CourseID INT:定义了一个整型字段,存储课程的唯一标识符。
主键:PRIMARY KEY (StudentID, CourseID):

这两个字段组合在一起作为主键,确保每个学生在每门课程上只能有一条记录,避免重复。
外键约束:

FOREIGN KEY (StudentID) REFERENCES Students(StudentID):StudentID 字段是一个外键,引用 Students 表中的 StudentID 字段,确保 Enrollments 表中的 StudentID 必须在 Students 表中存在。
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID):CourseID 字段也是一个外键,引用 Courses 表中的 CourseID 字段,确保 Enrollments 表中的 CourseID 必须在 Courses 表中存在。
综上所述,这个表用于管理学生与课程之间的关系,确保数据的一致性和完整性。*/
#插入学生记录
INSERT INTO Students (StudentID, StudentName) VALUES (1, 'Alice');
INSERT INTO Students (StudentID, StudentName) VALUES (2, 'Bob');
#插入课程记录
INSERT INTO Courses (CourseID, CourseName) VALUES (101, 'Mathematics');
INSERT INTO Courses (CourseID, CourseName) VALUES (102, 'History');
#插入选课记录
INSERT INTO Enrollments (StudentID, CourseID) VALUES (1, 101);  -- Alice选修数学
INSERT INTO Enrollments (StudentID, CourseID) VALUES (1, 102);  -- Alice选修历史
INSERT INTO Enrollments (StudentID, CourseID) VALUES (2, 101);  -- Bob选修数学

再引入一张图片使得更加容易理解多对多的关系

4-外键约束

外键约束是数据管理系统中一种重要的完整性约束,用于维护数据之间的关系和一致性。外键约束确保在一个表中引入另一个表记录的时候,这些引用的记录必须存在,从而避免孤立的数据不一致的关系。

1-主要功能

1-维护数据的完整性

确保外键列中的每个值在被引用的主键列中存在。这样就意味着不能插在外键列表中插入不存在主键列表中的值。

2-实现关系、

外键约束在不同的表之间建立起了关系,帮助组织和管理数据。

3-自动更新和删除

可以设置外键约束时的行为,比如级联更新(CASCADE)和级联删除(CASCADE),当主表中的记录被修改或删除的时候,相应的更新或者删除从表中的记录。

2-简单的语法

给某个表中的某一列添加外键约束

引入代码如下

sql 复制代码
foreign key( 当前表中的列名 )  references 被引用表名(被引用表的列名);
foreign key( coder_id )  references coder(id);

注意:在一般的开发当中,被引用的列名都是被引用表中的主键。

举例如下

sql 复制代码
constraint [外键约束名称] foreign key(当前表中的列名) references  被引用表名(被引用表的列名)
举例:constraint coder_project_id foreign key(coder_id) references coder(id);

对其中的关键做一下解释

constraint: 添加约束,可以不写

foreign key(当前表中的列名): 将某个字段作为外键

references 被引用表名(被引用表的列名) : 外键引用主表的主键

3-举例

我们首先创建一下表格,然后向其中插入一些需要测试的数据

sql 复制代码
-- 创建程序员表
create table coder(
	id int primary key auto_increment,
	name varchar(50),
	salary double
);
-- 创建项目表
create table project(
	id int primary key auto_increment,
	name varchar(50)
);
-- 创建中间关系表,也就是第三张表格
create table coder_project(
	coder_id int,#这个外键来源于coder表中的主键
	project_id int#这个外键来源与project中的主键
);


-- 添加测试数据
insert into coder values(1,'张三',12000);
insert into coder values(2,'李四',15000);
insert into coder values(3,'王五',18000);

insert into project values(1,'QQ项目');
insert into project values(2,'微信项目');

insert into coder_project values(1,1);
insert into coder_project values(1,2);
insert into coder_project values(2,1);
insert into coder_project values(2,2);
insert into coder_project values(3,2);

接下来,给第三张表中添加一下外键约束

第一种方式是:给已经存在的表中添加外键约束

sql 复制代码
-- 来自于程序员表
alter table coder_project add constraint c_id_fk foreign key(coder_id) references coder(id);
-- 来自于项目表																			
alter table coder_project add constraint p_id_fk foreign key(project_id) references project(id);

第二种方式是在创建表的时候就给添加一下外键约束

sql 复制代码
create table coder_project(
	coder_id int,
	project_id int,
    constraint c_id_fk foreign key(coder_id) references coder(id),
    constraint p_id_fk foreign key(project_id) references project(id)
);

5-外键的级联

在修改和删除主表的主键时,同时更新或删除从表的外键值,称为级联操作 ON UPDATE CASCADE -- 级联更新,主键发生更新时,外键也会更新 ON DELETE CASCADE -- 级联删除,主键发生删除时,外键也会删除

首先可以先删除上面的三张表

然后重新创建三张表,添加级联更新和级联删除

具体sql语句如下

sql 复制代码
-- 创建程序员表
create table coder(
	id int primary key auto_increment,
	name varchar(50),
	salary double
);
-- 创建项目表
create table project(
	id int primary key auto_increment,
	name varchar(50)
);
create table coder_project(
	coder_id int,
	project_id int,
    -- 添加外键约束,并且添加级联更新和级联删除
    constraint c_id_fk foreign key(coder_id) references coder(id) ON UPDATE CASCADE ON DELETE CASCADE,
    constraint p_id_fk foreign key(project_id) references project(id) ON UPDATE CASCADE ON DELETE CASCADE
);

内容到这里就先结束了,下次再见!

相关推荐
计算机学姐23 分钟前
基于Python的影院电影购票系统
开发语言·vue.js·后端·python·mysql·pycharm·pip
是僵尸不是姜丝28 分钟前
MySQL基础篇总结
数据库·mysql
尘浮生1 小时前
Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
幽兰的天空1 小时前
深入解析 MySQL 数据库:锁表的处理
数据库·mysql
-273K1 小时前
33.Redis多线程
数据库·redis·缓存
齐 飞1 小时前
MongoDB笔记03-MongoDB索引
前端·数据库·笔记·后端·mongodb
柔软阳光1 小时前
(四)、Manticore Search学习笔记之本地表介绍
数据库·笔记·学习
KKTT012 小时前
Redis数据库测试和缓存穿透、雪崩、击穿
数据库·redis·缓存
python1563 小时前
SQL中的IN语句和EXISTS语句
数据库·sql
Aloudata3 小时前
在全域数据整合过程中,如何确保数据的一致性和准确性
大数据·数据库·人工智能·数据挖掘·数据分析