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
);

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

相关推荐
阿里小阿希3 小时前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
且行志悠3 小时前
Mysql的使用
mysql
白鹭3 小时前
MySQL源码部署(rhel7)
数据库·mysql
666和7774 小时前
Struts2 工作总结
java·数据库
还听珊瑚海吗4 小时前
SpringMVC(一)
数据库
星期天要睡觉5 小时前
MySQL 综合练习
数据库·mysql
Y4090015 小时前
数据库基础知识——聚合函数、分组查询
android·数据库
JosieBook6 小时前
【数据库】MySQL 数据库创建存储过程及使用场景详解
数据库·mysql