首页 > 数据库 >MYSQL-约束

MYSQL-约束

时间:2024-09-25 22:47:52浏览次数:16  
标签:coder MYSQL 外键 约束 project 表中 主键 id

1-limit语句

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

格式如下

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 

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

2-在已有表中添加主键

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

#举例,给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 

举例如下

CREATE TABLE Users (
    UserID INT PRIMARY KEY,
    Email VARCHAR(255) UNIQUE,
    Username VARCHAR(50) UNIQUE,
    FullName VARCHAR(100)
);

6-非空约束

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

字段名 字段类型 NOT NULL

举例如下

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 默认值

举例如下

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-多对多关系:

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

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

举例

#创建主要表格
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-简单的语法

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

引入代码如下

foreign key( 当前表中的列名 )  references 被引用表名(被引用表的列名);
foreign key( coder_id )  references coder(id);

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

举例如下

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

 对其中的关键做一下解释

constraint: 添加约束,可以不写

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

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

3-举例

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

-- 创建程序员表
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);

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

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

-- 来自于程序员表
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);

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

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语句如下

-- 创建程序员表
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
);

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

标签:coder,MYSQL,外键,约束,project,表中,主键,id
From: https://blog.csdn.net/lizhiwei21/article/details/142497643

相关文章

  • MySQL高阶1965-丢失信息的雇员
    目录题目准备数据分析数据实现题目编写解决方案,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:雇员的 姓名 丢失了,或者雇员的 薪水信息 丢失了返回这些雇员的id employee_id , 从小到大排序 。准备数据CreatetableIfNot......
  • 快速部署MySQL数据库
    一.下载对应的软件版本下载地址:http://mirrors.sohu.com/mysql/MySQL-5.6/备用地址:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/[root@localhost~]#wget-qhttp://mirrors.sohu.com/mysql/MySQL-5.6/sql-5.6.36-linux-glibc2.5-x86_64.tar.gz二、解压、配置用户和权限[root@loca......
  • mysql优化之sql语句优化、以及mysql一些高频面试题
    文章目录一、索引1、什么是索引2、添加索引的原则3、索引的优缺点4、索引分类5、mysql存储过程(方法)二、MySQL的逻辑架构1、逻辑架构2、MyISAM和InnoDB的区别三、mysql的索引数据结构1、BTree2、B+Tree四、缓冲池BufferPool1、预读机制2、预读失效3、淘汰策略五......
  • 达梦空格填充导致违反唯一约束问题排查及处理
    在oracle迁移到达梦过程中,创建主键提示违法唯一约束。如下所示:用户反馈没有重复数据原因是达梦空格填充模式参数(BLANK_PAD_MODE)为0 , 查询语句将忽略字符串的后缀空格,由于大部分其他都已经迁移过去,只有个别表报错,不能重新初始化实例,需要将有问题的数据查找出来删除查找重......
  • mysql数据库 - anolisos安装
    文章目录一、anolisos系统介绍1.1、anolisos系统的起源1.2、anolisos系统的版本支持1.3、anolisos系统的特点1.4、anolisos系统的适用场景二、环境部署2.1、修改主机名2.2、修改静态ip地址2.3、关闭selinux2.4、关闭或放通防火墙端口三、安装mysql数据库3.1、更新yum源......
  • Linux常用命令(Mysql)
    --删除表内数据(Mysql)usedc;#切换到待删除表所在的数据库truncatetable[表名]#删除表--数据库导入SQL文件数据(Mysql)sourcea.sql;--SQL增删改查insertintostudent(id,name,sex,birth)values('01','赵雷','男','1990');deletefromstudentwhereid=......
  • Windows Server 安装MySQL教程(图文)
    本篇教程,在服务器WindowsServer2016(中文版)上安装MySQL8.0,并记录详细的安装步骤。1、下载安装包在mysql官网上下载安装包下载地址:https://dev.mysql.com/downloads/installer/2、安装步骤下载之后,双击运行mysql-installer-community-8.0.39.0.msi如果双击无反应,那么需要安装一......
  • MySQL SQL基础常见面试题整理
    NOSQL和SQL的区别是什么?SQL数据库是指关系型数据库,主要有:SQLServer,Oracle,MySQL(开源),PostgreSQL(开源)。关系型数据库用于存储结构化数据,这些数据在逻辑上以行和列的二维表形式存在,每一列代表一个数据属性,每一行则代表一个数据实体。NoSQL是指非关系型数据库,主要有MongoDB和......
  • Linux中MySQL配置主主复制操作
    一、GTIDGTID(GlobalTransactionIdentifier)是MySQL的一种用于标识分布式环境中事务的全局唯一标识符。它在MySQL的主从复制场景中尤为重要,尤其是在使用MariaDB或MySQL5.6及更高版本的环境中。GTID由两部分组成:服务器ID(标识执行该事务的服务器)和事务序号(表示在该服务器上执......
  • 解读MySQL8.0数据字典重构源码
    摘要:本文对社区MySQL5.7到8.0演进过程中数据字典DD的重构(缓存,持久化),AtomicDDL的关键实现进行了分析。本文分享自华为云社区《【华为云MySQL技术专栏】MySQL8数据字典重构源码解读》,作者:GaussDB数据库1.背景介绍在MySQL5.7版本的使用实践过程中,我们很容易遇到DDL崩溃后导致数......